C# 2.0 的表達能力已經在我們的項目中得到檢驗,先看看1.1時哪些問題沒弄明白:
Q: 4,@ 取消轉義
取消字串轉義尚可理解,不過連關鍵字都變成普通標識了,實在看不出有多大意義
A: 與其他程式設計語言建立介面時很有用
.Net多語言平台, foreach 在C++中不是關鍵字,可以作為函數名稱,那麼匯入到C#程式中就是 @foreach
Q: 13,屬性許可權
get/set好像不能設定不同的許可權,比如,我想internal set,而public get,不知怎麼弄
A: 現在可以了
public String Name{
get { return name; }
internal set { name = value; }
}
Q: 16,new virtual有沒有意義?
A: 顯式的new,virtual,override聲明和隱藏規則,都旨在消除版本演化的影響,使語義不會隨著父類增刪方法,改變方法修飾符而變化 ("new virtual", "abstract override"屬於C#的新發明)
新寫一點筆記:
1,Prefer using to finally, workaround for GC + dtor
using 語句 |
static void Main() { using (TextWriter w = File.CreateText("test.txt")) { w.WriteLine("Line one"); w.WriteLine("Line two"); w.WriteLine("Line three"); } } |
2,委託
“委託的一個有趣且有用的屬性在於,它不知道也不關心它所引用的方法的類;它所關心的僅是所引用的方法與委託具有相同的參數和傳回型別”--函數式編程風格在物件導向語言中的完美融合 ,配之以2.0引入的匿名方法,即類比的lambda,匿名方法可隱式轉換為與之相容的委託類型;3.0將引入真正的lambda
3,Attribute: Pointcut在代碼中的手工配置
4,使用者定義型別轉換:Mapper Design Pattern在語言層面的支援
5, 巢狀型別
常量或型別宣告會隱式地聲明靜態成員,即區別於Java,C#所有巢狀型別都是靜態,巢狀型別和包含它的那個類型並不具有特殊的關係,但可以訪問包含它的那個類型可訪問的所有成員,包括private,即類似C++的friend
6,數組協變
數組協變不能擴充 value-type 的數組。例如,不存在允許將 int[] 當作 object[] 來處理的轉換
7,重寫顯式介面成員實現
由於顯式介面成員實現不能被聲明為虛的,因此不可能重寫顯式介面成員實現。然而,有很多種方法可以繞過此限制,比如:
8,finally
"在 C# 中,利用 finally 塊(第 8.10 節)可編寫在正常執行和異常情況下都將執行的終止代碼。在 C++ 中,很難在不重複代碼的情況下編寫這樣的代碼"--這個有點自吹自擂了,C++的解構函式是最好的finally塊,這個說了很多遍了,不說了
9,解構函式的異常
特別值得注意的是在解構函式執行過程中發生的異常。如果在解構函式執行過程中發生異常且該異常未被捕獲,則將終止該解構函式的執行,並調用它的基類的解構函式(如果有)。如果沒有基類(如 object 類型中的情況),或者如果沒有基類解構函式,則該異常將被忽略
10 泛型
不同於C++大部分實現的編譯時間展開(膨脹)和Java的編譯時間擦拭,.Net反而是運行時展開(膨脹),造成的影響有:
泛型類聲明中的靜態變數在相同封閉構造類型(第 20.5.2 節)的所有執行個體之間共用,但是不會在不同封閉構造類型的執行個體之間共用(與C++相同,與Java不同)
泛型和非泛型同名類可以共存(Queue, Queue<T>),避免流血分裂(Java則是通過擦拭法來避免)
11 迭代器
正成為主流程式設計語言的標配,Java保持沉默,C++還只是通過標準庫來支援,Python和C#則提供文法層級的支援
12 可空類型
原以為是Null Object Design Pattern在語言層級的支援,當發現“當 HasValue 為 false 時,嘗試訪問 Value 屬性將引發異常”就知道不是那麼回事了,實際上Null Object確實不容易統一實現,Dynamic Proxy有可能是潛在手段之一,不過C#的可空類型有點像專門為資料庫訪問做的最佳化;為了這個特定領域,引入專門的語言擴充,特定API的簡便不知道能不能值回複雜性的增加;其實完全可以通過類庫的形式來實現可空類型:Nullable<T>,為它定義到 T 的隱式轉換運算子和其它必要的設施即可,實際情況也差不多如此:int? 之類的聲明是System.Nullable<int>的簡寫,而 a ?? b更是 a == null ? b : a的簡化形式