程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#初學筆記

C#初學筆記

編輯:C#入門知識

畢業設計要用到c#。
在學過了c++和java後,初看《c#入門經典》和《c#高級編程》,不免在心裡把c#和java與c++在語法方面做些比較,做些筆記。

預編譯:
像C++一樣,c#中有預編譯命令

namespace 和 using:
還搞不太懂,和java中import有些相同

基本和數據類型:
像c++中一樣有unsigned類型,如uint,ushort等等

goto:
java中被廢掉的goto關鍵字又回來了

const:
定義常量用const關鍵字;

@:
@符號後面的字符串就是字面的意思(沒有轉移字符),比如string s = @"\n" 這s就是"\n"而不是一個換行符

foreach:
如int[] intArray = new int[3];foreach(int i in intArray){...}

switch:
可以用於string;default不一定要寫在最後一句,但只有在沒有case匹配時才會執行;每個case必須有break或return或goto case ...結束,兩個或多個case連續寫在一起的情況除外

enum:
默認的underlying type是int,從0開始賦值,可以像int一樣進行運算,也可以和int相互轉換。underlying type也可以是其他的基本數據類型,也可以自己賦值。
01
enum Orientation:byte
02
{
03
    east,
04
    west=3,
05
    north,
06
    south=north
07
}
08
...
09
Orientation o = Orientation.south;          
10
int i = (byte)o;
11
Orientation east = (Orientation)0;
12
Orientation direction = (Orientation)Enum.Parse(typeof(Orientation), "north");//字符串轉化為枚舉
typeof:
typeof(Object)感覺像java裡面的Object.class;object.GetType()像java裡面的object.getClass();

struct:
結構派生於System.ValueType,它又派生於System.Object
結構體struct和class很像,同樣可以有屬性和方法,也可以實現接口,但struct是值類型,而class是引用類型
1
MyStruct struct1 = new MyStruct();
2
MyStruct struct2 = struct1;
3
//struct1復制了一份給struct2,對struct2的設置不會影響struct1
4
MyClass class1 = new MyClass();
5
MyClass class2 = class1;
6
//對class2的修改會影響class1,因為它們指向同一個實例
ref,out:
ref使得參數按引用傳遞

1
void Triple(ref int a)
2
{a *= 3;}
3
...
4
int a = 3;
5
Triple(ref a);
6
Console.WriteLine(a);//a變成9
out和ref功能和用法相同,區別在於用ref傳入函數的參數必須先初始化,out不用

params:
params關鍵字使函數可以接受個數任意的參數
int fun(params int[] a)就像java中的int fun(int...a)

Main函數:
有4種static int Main(string[]args),static void Main(string[]args),static int Main(),static void Main()


多維數組,變長數組:

1
int[][] array = new int[3][];// 變長數組          
2
array[0] = new int[3];
3
array[0][1] = 43;
4
 
5
int[,] array2 = new int[4, 5];//多維數組
6
array2[0, 1] = 32;
而java中都是變長數組,即數組的數組

checked和unchecked:
使用checked會在溢出是拋出異常,默認是unchecked

1
byte b = 255;
2
checked { b++; }//拋出異常
3
Console.WriteLine(b);
 

delegate:
委托(代理)好像就是c++中的函數指針,委托也是一種類,派生於System.MulticastDelegate

1
int add(int a,int b){return a+b;}
2
int subtract(int a,int b){return a-b;}
3
delegate int Fun(int a,int b);
4
Fun f = add;
5
int a = f(1,1);//得到2
6
f=subtract;
7
int b = f(1,1);//得到0
多播委托可以使用+、-、+=、-=運算符

集合:
Array和ArrayList等都用中括號[]來索引,Dictionary還可以用任意類型的引索(這讓我想到了js)

1
Dictionary<string, int> dic = new Dictionary<string, int>();
2
List<int> l = new List<int>();
3
...
4
int a = (int)al[0];
5
int b = dic["haha"];
 

函數重載:
virtual顯式指定虛函數或虛屬性。不用virtual則默認不是虛擬的(這和C++一樣,而java則默認都是虛擬的)。
override關鍵字用於重載虛函數,new關鍵字用於顯式聲明子類的函數隱藏了父類的同名函數。

01
class A
02
{
03
    public void M() { Console.WriteLine("a"); }
04
    public virtual void V() { Console.WriteLine("a"); }     
05
}
06
class B : A
07
{
08
    public new void M() { Console.WriteLine("b"); }
09
    public override void V() { Console.WriteLine("b"); }
10
}
11
...
12
A a = new B();
13
B b = new B();
14
a.M();//a
15
a.V();//b
16
b.M();//b
17
b.V();//b
虛函數的調用取決於實例的類型,而非虛函數的調用取決於引用變量的類型
試了一下發現verride不能和virtual一起用,但如果將來有一個C類要重載B類的V()方法,怎麼使B.V()成為虛函數啊?


操作符重載:
重載的方法和C++中的一樣(記得學C++時我最喜歡這個了,很方便啊),但限制比C++多。比如必須聲明為public和static;不能重載“+=”,重載“+”之後“+=”自然可以使用;不能重載“=”;可以重載“&”,不能重載“&&”;“<”和“>”、“<=”和“>=”、“!=”和“=”要成對重載,不能只重載一個;而且好像只能重載成靜態static的。

1
class Time
2
{
3
    public int hour, min;
4
    public Time(int h, int m) { hour = h; min = m; }
5
    public static Time operator +(Time a, Time b)
6
    { return new Time(a.hour + b.hour, a.min + b.min); }
7
}
 

自定義數據類型轉換:
很強大啊,用法像重載操作符一樣,同樣必須是public static。可以在類和基本數據類型之間,類和類之間轉換。implicit說明可以隱式轉換,explicit指明必須顯示轉換。轉換函數必須寫在源類型或目標類型的類或結構體定義裡面,有繼承關系的本來就可以轉換的類之間不能重載。

01
class C
02
{
03
    public int x;
04
    public C(int i) { x = i; }
05
    public static implicit operator int(C c) { return c.x; }
06
    public static explicit operator C(int i) { return new C(i); }
07
}
08
...
09
int i = new C(3);//i=3
10
C c = (C)5;//c.x=5
11
byte b = (byte)new C(2);//b=2,C被轉換成int類型後被轉換成byte
 

boxing和unboxing:
在引用類型和值類型之間相互裝換,boxing是自動進行的,而unboxing是要顯式說明的

1
int i = 0;
2
object o = i;//i被自動裝箱成引用類型o
3
string str = 2.ToString();//2被被自動裝箱成一個臨時的引用類型
4
int b = (int)o;//取消裝箱
5
Console.WriteLine(Object.ReferenceEquals(i,i));
6
//值類型用ReferenceEquals(a,b)函數進行比較總是得到false,因為裝箱之後的引用變量指向了原來值類型變量的一份拷貝,而不是原值。這樣對裝箱對象的操作不會影響原來的值類型的內容。
《C#高級編程》上的意思是:定義結構體時,.Net Framework會隱式的提供一個隱式類,與結構體相同,卻是一個引用類型,用於裝箱。枚舉類型也有類似情況。

is和as:
“is”和java中的“instanceof”相當;as用於嘗試類型轉換

1
ClassA a = (ClassB)b;//無法轉換時可能拋出異常
2
ClassA a = b as ClassA//無法轉換時a=null

事件:
事件處理時c#使用委托,感覺概念上和OOP思想不太相符,不如java中監聽器的概念清晰。

關於類的可見性:
protected——只能由類或派生類的訪問
internal——只能由定義它的工程(程序集)內部代碼訪問
private——默認不寫就是private
sealed——相當於java中的final,使類不能被派生,或使函數不能被重載
virtual,override,new,extern關鍵字還不很清楚

property:
感覺好無聊,使用時讓人分不清是屬性(property)還是字段(field),其實和java中的setter、getter方法一樣的功能www.2cto.com

繼承:
同樣是單繼承、多接口,用逗號隔開,繼承的類寫在第一個,然後是要實現的接口,用逗號隔開。父類用base關鍵字,構造函數後面可用冒號跟其他的構造函數

view sourceprint?
01
interface I { void DoSth();}
02
class A
03
{
04
    private int a;
05
    public A(int a) { this.a = a; }
06
    public void Method() { Console.WriteLine("A.Method()"); }
07
}
08
class B : A ,I
09
{
10
    private int b;
11
    public void DoSth(){}
12
    public new void Method() { base.Method(); Console.WriteLine("B.Method"); }
13
    public B(int a, int b) : base(a) { this.b = b; }
14
    public B(int b):this(0,b){}
15
}


摘自 leo_de_macondo

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved