星期一, 2月 27, 2006

C# 學習筆記

最近開始研究c#.net 以及MDX 把一些心得寫下來以免忘記‧‧‧
1. 回傳值可以是陣列參考
2. 陣列本質是指標(c#稱為參考) 與java同
3. 比較兩陣列時"==" 實際是比較是否為同一位址
4. 比較兩字串時 並非比較兩個位置 而是字串內容 跟java不同
5. 由於陣列實際是指標在運作 所以可以用多維不定數的陣列
規則是用 [x,y]
不規則是用 [x][y]
6. 改成unsafe就可以自由操作指標 預設是託管
7. GB可自由選擇是否要自己釋放動態記憶體 以免需要高效的程式因此delay
8. foreach用法
規則不管幾維
int [,]array=new int[7,12];
foreach(int temp in array)
{System.Console.WriteLine(temp); }
不規則多維
int [][][]array=new int[7][12][22];
foreach(int [][] out in array)
foreach(int [] mid in out)
foreach(int inner in mid)
{System.Console.WriteLine(inner); }
9.類別宣告裡可直接設值 同java
10.const 本身就是static
11.swap(ref int a,ref int b)等同於c++的 swap(int &a,int &b) 但是呼叫時也要加ref
xxx.swap(ref val1,ref val2);
12.out同ref 但他可以接受為設值的參數
13.參數params可作為任意數量的參數預設值 如int sum(params int [] nums)
如此可用sum(a,b) sum(a,b,c,).....
13.readonly關鍵字類似const 但是不用在宣告時設值 且預設非static
14.c#的解構子與c++不同 是由GB去喚醒
15.c#有property的觀念 也就是屬性 一個屬性可用get 與 set去操作 如此一來 在client端就可以
直接寫 xx=value; 不用再object.setXX(value);
16.c#提供內部定義陣列索引 例如
public int [] abc=new int[4];
public int this[int index]
{
set
{
abc[index]=value;
}
}
value 為隱含式的值
17.c#沒有template 跟java一樣
18.使用using XXXXXX= aaaa.bbb.ccc.ddd 可以簡化 namespace長度
這樣就可以使用 XXXXX.method();
19.c#使用namespace 來封裝類別 類似java的package
20.class前面加一個sealed關鍵字代表這個類別不能被繼承 通常用於此類別都是static時
21.internal關鍵字 代表部件內的成員都可以存取
22.base()可使繼承類別呼叫基礎類別的建構子
23.virtual代表可以被override override代表覆寫
24.在override函式裡面 可以用base.XXX()來呼叫原始的基底函式
25.abstract 表示該method 或是property或 arrayindex 只能在子類別被實作 且不能創建實體物件
但可以擁有實作的method
26.is關鍵字可以測試該物件是否為某類別 例如 if (object is XXClass)
27.as關鍵字可以簡化(26)所用的語句 如
myXX=aaa as XX;
if (myXX!=NULL)
do_some_thing;
會等於
if (aaa is XX)
{myXX=(XX)aaa;}
28.創建的類別如果沒有指定基礎類別 就預設是繼承自System.Object
29. 衍生類別method前面若加上new 則代表此物件是要隱藏父類別的同一method 也就是c++
的父類別不加virtual 的結果 c#假設前面不寫virtual 預設就是new 也就是不會動態聯繫
30.c#不支援多重繼承 用interface來代替
31.interface類似c++的pure virtual class 且不能擁有member
32.interface method不用加上存取修飾子 實作它的子類別可以加上父類別名來區別
例如 void IXXable.DrawYY();
33.上述為顯示介面函數 如果要呼叫他 必須這樣寫
Ixxable aaa=new implimentClass();
aaa.DrawYY;
不能寫
implimentClass aaa=new implimentClass();
aaa.DrawYY;
用這樣來達到多型的效果
34.用interface可以達到template的效果
35.struct與class同 但不支援繼承 且不包含解構式
36.delegate關鍵字 類似c++的函式指標 主要用於封裝方法 如
public delegate double XXX(int x,int y);
public double Sum(int x,int y){}; //參數與返回值型態都要匹配
XXX myXXX=new XXX(Sum);
double result=myXXX(10,20);
37.多重委託返回型態一定要是void
38.event是用多重委託來達成
public delegate double XXX(int x,int y);
public event XXX myXXX;