屬性訪問器保護層級的變化
C# 2.0 允許我們對一個屬性的get和set訪問器使用不同的存取層級修飾符:
class Customer
{
private string name;
...
public string Name
{
get{return this.name;}
internal set(this.name=value;}
}
...
}
一些注意點
屬性訪問器(get或set)上應用的存取修飾詞必須“小於”屬性上應用的存取修飾詞;“小於”的意思即“更嚴格”,例如protected小於public。
只能在一個屬性訪問器(get或set)上指定比屬性上的存取修飾詞“更小”的存取修飾詞。
對於介面中屬性的聲明,不能給屬性訪問器(get或set)指定任何存取修飾詞,只能預設為public。
屬性訪問器保護層級的變化規則完全適用於C#的索引器。
---------------------------------------------
名稱空間別名限定符的引入
C# 2.0 允許我們使命名空間別名限定符(::)來避免不同命名空間中類型名稱衝突的問題:
using SC = System.Collections;
using ZC = Zhucheng.Collections;
class Program
{
static void main()
{
ZC::ArrayList list = new ZC::ArrayList();
...
}
}
一些注意點
當使用命名空間別名限定符(::)時,如果ZC:ArrayList,編譯器可以確保這是一個只適用於“名稱空間別名”的限制符,不會辨析為其他類型、或者成員限定符(.)。
關鍵字global可以放在命名空間別名限定符(::)的左邊,它使得編譯器只去搜尋那些所有的命名空間,而不會去搜尋其他的類型、或成員。
儘可能地使用命名空間別名限定符(::),而減少使用點號(.)這樣的通配限定符。
---------------------------------------------
pragma指示符的引入
C# 2.0 允許我們使用命名空間別名限定符(::)來避免不同命名空間中類型名稱衝突的問題:
class program
{
[Obsolete]
static void Foo(){...}
static void Main()
{
#pragma warning disable 612
Foo();
#pragma warning restore 612
}
}
幾個注意點
目前pragma指示符只支援#pragma warning
#pragma warning disable 可以禁止掉任何編譯器警告資訊。
#pragma warning restore 可以恢複被disable掉的任何編譯器警告資訊。
可以在disable和restore後面跟上具體的警告代碼號,從而來禁止或者恢複特定的警告資訊。
#prama是一個編譯預先處理功能,不影響任何代碼運行機制。
---------------------------------------------
Conditional屬性類別的引入
C# 2.0 允許我們使用Conditional屬性類別來告訴編譯器根據“特定的預定義指示符條件”來在類上應用特性。
#define DEBUG
using System;
using System.Diagnostics;
[Conditional("DEBUG")]
public class TestAttribute : Attribute{}
[Test]
class MyClass{}
幾個注意點
如果定義了條件指示符,如#define DEBUG,那麼編譯器將在MyClass類上應用TestAttribute特性。
如果沒有定義條件指示符,如#undef DEBUG,MyClass類照樣可以正常使用,但是其上將不在應用TestAttribute特性。
注意區別C# 2.0 中的Conditional屬性類別和C# 1.0中的Conditional特性方法。
定長buffer的引入
C# 2.0 引入定長來使得我們可以在結構裡聲明C風格的數組,從而更加方便地實現Managed 程式碼和Unmanaged 程式碼的互操作:
unsafe struct MyClass
{
public fixed int x[5];
public fixed int y[10];
public fixed int z[100];
}
幾個注意點
定長buffer只能使用在unsafe代碼的上下文中,不可以在非unsafe的代碼中使用。
使用定長buffer所定義的欄位在結構類型的執行個體對象中將按照它們的聲明順序來進行記憶體布局。
注意區別unsafe代碼中的定長buffer和我們通常使用的託管數組。
定長buffer主要應用在Managed 程式碼和Unmanaged 程式碼互操作的情況,除此之外,我們一般使用託管數組。
---------------------------------------------
C# 3.0 與未來發展
C# 2.0 的核心機制在於泛行編程的引入,它賦予了型別參數式多態的能力,將對今後的C#代碼構造有重要影響。
研發中的C# 3.0 將XML、SQL兩中資料處理技術引入到C#這樣的強型別語言中,極大地豐富了C#語言的資料處理能力,是一個極具遠見的創新。
C#語言的發展越來越多體現融合“設計模式+庫”的思想,“語言的發展就是庫的發展”。