如自動屬性Int1生成了私有字段"<Int1>k__BackingFIEld",盡管在C#裡這不是合法的標識符,但在IL裡是合法的。
生成了兩個方法:set_Int1(int32 'value')和get_Int1(),由於上面Int1的set設置器聲明為私有的,因此set_Int1(int32 'value')為私有方法。
而相對應的傳統的屬性如果編碼只有set或get,則get_XXX或set_XXX方法是不存在的。
如果在代碼裡寫入具有相同簽名的get_XXX或set_XXX方法編譯會出錯:"Type 'CS30NEW.Test1' already reserves a member called 'get_Int2' with the same parameter types"
屬性在IL用方法來實現的目的是跨語言,有些語言不支持屬性,可以使用相應的方法來實現相同的操作。IL生成的get_XXX或set_XXX盡管是公開的,但C#不允許顯式訪問這些方法,如果訪問這些方法編譯會出錯:"'CS30NEW.Test1.Int2.get': cannot explicitly call Operator or Accessor"。
隱含類型局部變量(Local Variable Type Inference)
如定義一個局部整型數組時:
int[] a = new int[10];
賦值符號後面已經知道是數組類型了賦值符號前面還要指明是數組類型,是不是顯得特別傻。
隱含類型可以這樣定義:
var a = new int[10];
a.GetType().ToString()輸出可以看到a為System.Int32[]類型。
貌似跟Javascript的var很像,其實差別很大。Javascript為弱類型語言,定義變量後可以對其任意賦值,而C#中用var定義局部變量有幾點注意事項:
顧名思義,var只能定義局部變量。
var聲明的同時必須初始化。
初始化時變量的類型已經確定,如果對其賦值其它類型編譯會出錯,提示類型不匹配。
var變量不能用於方法的形參。
在編譯時變量的類型已經確定,這也是編譯器做的工作。
對象初始化器(Object Initializers)
如有以下對象:
public class Test1
{
public string String1 { get; set; }
public int Int1;
public Test1() { }
public Test1(int i) { Int1 = i; }
}