The C# Programming Language Notes II

來源:互聯網
上載者:User

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,重寫顯式介面成員實現

由於顯式介面成員實現不能被聲明為虛的,因此不可能重寫顯式介面成員實現。然而,有很多種方法可以繞過此限制,比如:

  • 顯式介面成員實現的內部完全可以調用另一個方法,只要將該方法聲明為虛方法,衍生類別就可以重寫它了

  • 一個類若繼承了某個介面的實現,則只要將該介面列入它的基類列表中,就可以重新實現 (re-implement) 該介面

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的簡化形式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.