局部類型、空屬類型、靜態類、和其他雜項技術zz

zz from WebCast—C#2.0銳利體驗

 

1 局部類型簡介:
• 局部類型允許我們將一個類型(類、結構或者接口)分成幾個部分,分別實現在幾個不同的.cs文件中。
• 局部類型適用於以下情況:類型特別大,不宜放在一個文件中實現;一個類型中一部分代碼爲自動化工具生成的代碼,不宜與我們自己編寫的代碼混合在一起。
• 局部類型是一個純語言層的編譯處理,不影響任何執行機制——事實上C#編譯器在編譯的時候仍會將各個部分的局部類型合併成一個完整的類。


2. 局部類型的幾個注意點:
• 局部類型只適用於類、結構、或接口,不支持委託或枚舉。
• 同一個類型的各個部分必須都有修飾符partial。
• 使用局部類型時,一個類型的各個部分必須位於相同的命名空間中。
• 一個類型的各個部分必須被同時編譯。換言之,C#不支持先編譯一個類型的某些部分,然後再編譯一個類型的某些部分。
• 局部類型上的特性具有“累加”效應。
• 一個類型的各個部分上的訪問保護修飾符必須維持一致性。
• 如果一個類型有一個部分使用了abstract修飾符,那麼整個類將被視爲抽象類。(sealed同理)
• 一個類的各個部分不能使用相互矛盾的修飾符,比如不能在一個部分上使用abstract,又在另一個部分上使用sealed。
• 一個類型的各個部分上指定的基類必須一致。某些部分可以不指定基類,但如果指定,則必須相同。
• 局部類型上的接口具有“累加”效。

 

3 空屬類型簡介
空屬類型允許一個值類型具有“空值”意義,從而方便很多場合的運算,如數據庫中的空字段。


4 空屬類型的幾個注意點
• 空屬類型實際上是一個泛型類型System.Nullable<T>。空屬類型的基礎類型就是System.Nullable<T>的類型參數,其中T必須爲值類型。
• 空屬類型如果值不爲空,可以運用同樣的基礎類型所具有的運算,如+, - , *, /
• 空屬類型的HasValue 屬性用來判斷類型是否爲空,如果不爲空,則可以通過Value屬性來獲取它的基礎類型的值。
• 空屬類型是一個struct值類型,一般不要用,以免帶來性能問題。

int i=123;
int? x = i;//等價於System.Nullable<int> x = new System.Nullable<int>(i);
double? y = x;
int z = (int)y;
Console.WriteLine(x);
//將x裝箱成object,然後輸出。MS咋就不重載下WriteLine方法呢?!
Console.WriteLine(i+z);

Console.WriteLine(x.Equals(i));
//輸出結果爲true,相當於x.Equals(new System.Nullable<int>(i))
Console.WriteLine(i.Equals(x));//輸出結果也爲true!
Console.WriteLine(x is int?"true":"false");//輸出結果爲true!

 

 

5 靜態類簡介
靜態類是隻用於包含靜態成員的類型,它既不能實例化,也不能被繼承。它相當於一個sealed abstract類。


6 靜態類的幾個注意點
• 靜態類不能有實例構造器。
• 靜態類不能有任何實例成員。
• 靜態類上不能使用abstract或sealed修飾符。
• 靜態類默認繼承自System.Object根類,不能顯式指定任何其他基類。
• 靜態類不能指定任何接口實現。
• 靜態類的成員不能有protected 或protected internal訪問保護修飾符。

7. 屬性訪問器保護級別的變化
(1) 屬性訪問器(get或set)上應用的訪問修飾符必須“小於” 屬性上應用的訪問修飾符;“小於”的意思即“更嚴格”,例如protected小於public。
(2) 只能在一個屬性訪問器(get或set)上指定比屬性上的訪問修飾符“更小”的訪問修飾符。
(3) 對於接口中屬性的聲明,不能給屬性訪問器(get或set)指定任何訪問修飾符,只能默認爲public。
(4) 屬性訪問器保護級別的變化規則完全適用於C#的索引器。


8. 命名空間別名限定符的引入
(1) 當使用命名空間別名限定符(::)時,如ZC::ArrayList ,編譯器可以確保這是一個只適用於“命名空間別名”的限定符,不會辨析爲其他類型、或者成員限定符(.)。
(2) 關鍵字global可以放在命名空間別名限定符(::)的左邊,它使得編譯器只去搜索那些所有的命名空間,而不會去搜索其他的類型、或者成員。
(3) 儘可能地使用命名空間別名限定符(::),而減少使用點號(.)這樣的通用限定符。


9. Pragma 指示符的引入
    用處:忽略對編譯器的警告
(1) 目前Pragma 指示符只支持# pragma warning
(2) #pragma warning disable可以禁掉任何編譯器警告信息。
(3) #pragma warning restore可以恢復被disable掉的任何編譯器警告信息。
(4) 可以在disable和restore後面跟上具體的警告代碼號,從而來禁止或者恢復特定的警告信息。
(5) #pragma 是一個編譯預處理功能,不影響任何代碼運行機制。


10. ConditionalAttribute類
    .Net Framework 1.X中,ConditionalAttribute只能應用到方法上,在2.0中,Conditional可以應用到Attribute類上。


11. 定長buffer的引入
    C# 2.0引入定長buffer來使得我們可以在unsafe結構裏聲明C風格的數組,從而更加方便地實現託管代碼和非託管代碼的互操作:
unsafe struct MyClass
{
    public fixed int x[5];
    public fixed int y[10];
    public fixed int z[100];
}
(1) 定長buffer只能使用在unsafe代碼的上下文中,不可以在非unsafe的代碼中使用。
(2) 使用定長buffer所定義的字段在結構類型的實例對象中將按照它們的聲明順序來進行內存佈局。
(3) 注意區別unsafe代碼中的定長buffer和我們通常使用的託管數組。
(4) 定長buffer主要應用在託管代碼和非託管代碼互操作的情況,除此之外,我們一般使用託管數組。

發佈了58 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章