1. 程式人生 > >我的C#

我的C#

1.C# 中的set get 的簡易寫法:
public string name
{
set;
get;


}
這樣就表示string這個屬性是可讀可寫的, 如果去掉get就是隻寫, 去掉set就是隻讀. 雖然是public 的, 這一點跟JAVA有一點不一樣


2. C# 中的decimal 也是一個既可以存小數也可以存整數的格式, 存的取值範圍比double小, 但是精度比double高 , 可以精確到28_29位小數. 可以double強轉成decimal. decimal 跟Java中的bigdecimal 是不一樣的, Java中的bigDecimal 實際上存的還是整數型.  C# 中的decimal在寫的時候後面要加一個m, 大小寫均可,用來表示這是一個decimal數
3. C# 中數值的計算好像跟Java 是沒什麼區別的, 整數型在計算的時候都會提升為int, 然後賦值的時候, 就要考慮是否強轉了, 
4. C# 中有字串格式化的方法, 例如對一個double數, 格式化只保留2位小數有以下幾種方法, double a = 0.134124; a.tostring("f2"); a.tostring("0.00"); 或者是string.format("{0:0.00}",a);{0} 表示挖坑,後面的
0.00 表示就是這個數字是一個0.00 的兩位小數形式. Console.WriteLine() 也有類似的操作, 不過估計也就是底層呼叫了string.format. 然後再 輸出, 不過C# 不是開源 , 所以不知道咯, 
5. C#中可以很快速的進行IO 讀寫, 直接用File 的靜態方法就可以了, File.WriteAllText() 和File.ReadAllText(),  一樣的在寫的時候, 如果是已經存在的就會先清空這個檔案裡面的東東,  這一點還是不錯的
6, string.format("{0}{1}", obj1,obj2); 這個就是挖坑填坑的方式.第一個引數會填充{0} 其實這個很容易實現的, 
7. C# 中的@ 符號, 有兩個作用, 一個是放在字串前, 表示當前字串取消\ 轉義符的功能. 這樣的話, 在書寫路徑的時候就不用寫\\了.

8. \b表示的是刪除前一個字元, 但是這個放在字串的最前面和最後面是沒有作用的, 還有就是在IO流中這個也是沒有意義的, 

1, C# 中使用Convert.ToInt 之類的方法來做型別轉換, 類似於Java中的Integer.valueOf. 但是同時還可以使用int.parse 這樣來轉換, 所以轉換的方法很多
2, C# 中的++ 和Java中一樣的, 也是放在後面表示先運算再自增, 放在前面表示先自增再參與運算, 多個++ 一起的話, 就是參與完運算之後就會自增, 然後參與下個運算, 例如int a =10;
int b = ++a+a++; 答案是b=22; 因為第一條語句++a 後a就是11了, 然後再加11 等於22, 最後a再自增變成12
3. C#中的一元運算子的優先度高於二元運算子. 例如++ 高於*. 這個跟Java 也是一樣的. 其實也可以理解為, 程式碼的運算都是從左到右, 但是會把優先度高的算完後再參與計算.
4. C#中邏輯與的優先程度是大於邏輯或的. 跟Java中也是一樣的, 現在證實了一點就是說Java或者C# 都是這樣, 遇到優先順序高的運算, 會把優先順序高的運算先執行完, 再去執行其他運算, 但是總體是從左往右的
5. C#中的try catch  跟Java中有點不一樣, C# 中的catch 可以不捕獲任何異常, 直接try{}catch{}, 但是Java中catch後面是必須跟一個異常類
6. c# 中的迴圈不可以做標記, 選擇跳出哪個迴圈, jAVA可以
7. VS 除錯很簡單, 就是F11 開始逐步除錯, 然後按F11 又變成下一句, 一直這樣就好了. 按下F11後開啟除錯, 監視, 可以寫下要監視的變數 , 也可以是一個表示式例如a+b.
8. C# VS 的斷點除錯, 先下一個斷點, 然後直接點選執行就可以了, 然後就會在這一點停下來, 然後再按F11 往下執行, 感覺比Eclipse的好用一些呀. 要監視的話還是一樣的, 在斷點之後, 調出監視, 寫上要監視的變數.
其實直接把滑鼠放在對應的變數上都會顯示這個時候這個變數的值
9. VS 中寫for迴圈很簡單的, 只要寫一個for然後按兩下tab鍵就可以了. 就會出現for迴圈
10. C#中無論是File或者Directory 或者是FileInfo, DirectoryInfo 都沒有直接的isFile或者是IsDirectory 的方法, 但是可以通過FileInfo.Attributes==FileAttributes.Directory 來判斷是否是資料夾或者是檔案.
 這一點跟Java 是有區別的, 還有就是C# 的方法中對於兩個路徑,如果是名字一樣大小寫不一樣也是當成同一個的, 因為在windows 中不存在這樣的兩個路徑, 因為是重複的, 
11. C# 中tostring("0.00") 以及String.format("{0:0.00}",double); 這樣做轉換的時候實際上都已經做了四捨五入了, 不是簡單的保留幾位小數而已.;
12. C# 中Stack.peek(). 如果此時棧內已經沒有值了則會丟擲異常, 於是乎可以通過是否丟擲異常來判斷是否還有值. 也可以通過stack.count來做判斷, 如果是0 表示沒有值了
13. C# 中複製檔案的類有很多, File.Copy, FileStream.CopyTo() 都可以做這件事情
14. C# 中FileStream是操作位元組的, StreamReader 和StreamWriter 是用來操作字元的, 一般用於文字檔案,
15. StreamWriter 建立的時候可以指定是否是追加. FileStream 也有這個引數, FileMode.Append. 如果不是追加的話, 寫的時候就會先清空原來的檔案內容
16. 對抽象方法或者是虛方法的重寫或者實現都是必須要加一個override的. 抽象類也是用abstract修飾, 抽象方法也是用abstract修飾, 並不是用virtual.實現一個抽象方法也是一樣的不可以修改修飾符
17. C# 中的介面也是可以有屬性的. 但是實際上這個也只是一個set get方法而已, 子類在實現這個介面的時候, 也還是必須要實現這個屬性的,  也就是說介面只有方法,  Java中也可以有屬性, 但是這些都變成了常量.
18. C# 中的靜態類只能有靜態的屬性和方法,Java中沒有靜態類.
19. C# 中不能建立物件的只有靜態類,抽象類, 介面
20. C# 中接口裡面只能有屬性,方法, 索引器和事件
21. 跟Java中一樣, C# 中抽象類可以繼承類, 但是介面不可以繼承類. 類同時繼承類並實現介面的時候 必須把介面寫在後面, 類寫在最前面
22. C# 中抽象類在實現介面的時候必須實現介面中的方法, 跟Java不一樣, Java中抽象類在實現介面的時候, 可以不用實現任何方法. 反正最終例項化的是子類. 這可能跟C# 中接口裡面的方法是特殊的有關. C# 中介面中的方法在被子類實現的時候, 不需要加override, 這一點跟虛方法和抽象方法都不一樣
23. C# 中 一個類可以顯示的實現介面的方法, 用這種寫法, void Father.Show(){}; 這個方法就跟介面一樣預設就是public的, 如果直接public void Show(){} 的話, 這個也是實現介面, 但是如果有顯示實現介面的話, 那這個就不是實現介面的方法了, 而只是一個普通的方法了.
24. C# 中一個類中如果一個屬性是直接顯示初始化的時候, 那麼這個顯示初始化會在整個外部物件的初始化之前. 其實就是把屬性的顯示初始化放在了整個外部物件的初始化構造方法的最前面.
25. C# 中 num.tostring("X") 可以把一個數字轉成16進位制; tostring("X2") 就是表示轉換最後的16進位制數的結果最少是2位數, 不足的話第一位補0.
26. C# 中可以選擇顯式的實現介面的方法或者是隱式的實現介面. 隱式實現 interface Man{ void Love()} . class Henry:Man{ public void Love(){}}. 顯式實現例如 class Henry:Man{void Man.Love(){}}. 對於前面這個來說如果父接口裡面只有一個這樣的方法, 是可以的, 但是如果是實現了兩個不同的介面但是都有這個方法的時候,  就只能採用顯式的實現了,這個時候這個方法必須是不加修飾詞的, 也就是說在建立子類物件
真正呼叫這個實現的方法的時候需要轉為父類介面引用, 再呼叫方法, 這樣才可以確定是呼叫哪個父類介面的方法,  對於隱式的實現介面方法的時候, 是可以直接呼叫的, 而且必須是public 的.
27. 實現抽象類的抽象方法的時候也是必須要加override 的, 唯一一個重寫但是不能寫override 的就是重寫介面的方法, 
28. 宣告一個event可以相當於將後面的這個委託方法變成一個集合一樣可以通過+= 或者-= 進行註冊或者登出, 但是不能直接在外部類中進行呼叫發生事件, 只能在宣告這事件的類中進行呼叫 發生的方法.
29. C#中判斷兩個物件是否是同一個地址值用的是object.referenceequals(object a, object b); 這一點跟Java 是不一樣的
30. C# 中被readonly修飾的變數不能重新指向新的地址, 但是可以修改所指向的地址內部的值. 這一點倒是跟Java中的final有一點像, 但是readonly 修飾的變數的初始化必須是在顯示初始化或者是建構函式中. 不可以在外部賦值.
31. Java 跟C# 有點在Clone上面都是相似的, Java中都是繼承Clonable, C# 是繼承ICloneable. 預設的淺拷貝實現Java中使Object的clone方法, C# 中是Object的MemberwiswCopy方法. 淺拷貝指的是目標物件的地址值不一樣, 但物件的各個值型別欄位相等, 引用型別一致. 也就是說引用的同一個物件, 深拷貝就是把引用型別的欄位也變成拷貝, 這樣就是深拷貝 , 也就是說兩個物件的地址不一樣, 但是屬性, 欄位完全一樣, 而且互相不影響.
32. Java中的成員變數顯示初始化, 可以引用在他前面定義的成員變數, 或者是靜態變數, 在C# 中不可以. C# 中的顯示初始化的變數都會構造中賦值.例如 類中有屬性 如下public int age =10; 那麼這個age=10 會出現在每一個建構函式中. 有理由相信,. Java中應該也是一樣的. 而且成員屬性顯示初始化的程式碼在建構函式中是位於開頭的地方, 也就是說比建構函式中其他手動編寫的程式碼要優先.