今天給大家分享一下C#語法糖的簡單的兩個知識點吧。 自動屬性:在 C# 4.0 和更高版本中,當屬性的訪問器中不需要其他邏輯時,自動實現的屬性可使屬性聲明更加簡潔。 客戶端代碼還可通過這些屬性創建對象。 get and set accessors." id="mt3">如下麵的示例所示聲明屬性時,編 ...
今天給大家分享一下C#語法糖的簡單的兩個知識點吧。
自動屬性:在 C# 4.0 和更高版本中,當屬性的訪問器中不需要其他邏輯時,自動實現的屬性可使屬性聲明更加簡潔。 客戶端代碼還可通過這些屬性創建對象。 get and set accessors." id="mt3">如下麵的示例所示聲明屬性時,編譯器將創建一個私有的匿名支持欄位,該欄位只能通過屬性的 get 和 set 訪問器進行訪問。
我們C#4.0以前的傳統方式的屬性是用來封裝欄位的,這裡我簡單的對比一下這兩種方式的不同及關聯關係吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class AutoProperty
{
//傳統方式定義屬性必須先定義欄位來封裝
private string name;
public string Name
{
get { return name; }
set { value = name; }
}
//自動屬性
public string LoginName { get ; set ; }
}
|
從代碼的字數上看傳統方式的寫法比較繁瑣,自動屬性一行代碼即可實現,然後到底這兩個功能上有什麼區別呢,這裡我用反編譯工具來看了一下(反編譯工具用的是.Net Reflector 8.3),具體效果如下:
雖然我們在寫代碼是沒有寫欄位,但是編譯器幫我們自動生成欄位,然後在每個屬性的get和set訪問器在看一下會發現
1 2 3 4 5 6 7 8 9 10 |
//傳統方式
public void set_Name( string value)
{
value = this .name;
}
public string get_Name()
{
return this .name;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 |
//自動屬性
[CompilerGenerated]
public void set_LoginName( string value)
{
this .<LoginName>k__BackingField = value;
}
[CompilerGenerated]
public string get_LoginName()
{
return this .<LoginName>k__BackingField;
}
|
使用自動屬性註意的地方:從上面代碼上可以看出來訪問器格式基本差不多,就是自動屬性訪問器上標記為編譯器生成,然後欄位也是編譯器生成的欄位。所以傳統方式和自動屬性對於編譯去來說效果是一樣的,只不過這些繁瑣的操作編譯器幫我們生成了,以減少程式員寫的代碼和讓代碼的邏輯很清晰,很簡短。
1、 對於自動實現的屬性,需要 get 和 set 訪問器。 要使該類不可變,請將 set 訪問器聲明為 private。 set accessor, you cannot use an object initializer to initialize the property." id="mt5">但是,聲明私有 set 訪問器時,不能使用對象初始值來初始化屬性。 必須使用構造函數或工廠方法。
1 2 3 4 5 6 7 8 |
public string CustomerId { get ; private set ; }
public AutoProperty( string _CustomerId)
{
this .CustomerId = _CustomerId;
}
|
隱式類型:可 以賦予局部變數推斷“類型”var 而不是顯式類型。 var 關鍵字指示編譯器根據初始化語句右側的表達式推斷變數的類型。 推斷類型可以是內置類型、匿名類型、用戶定義類型或 .NET Framework 類庫中定義的類型,這是微軟MSDN給出的定義,其實隱式類型簡單的理解就是程式員在聲明變數可以不用指定類型,由編譯器根據值來指定類型。2、 如果需要在屬性中有複雜的業務邏輯的話還得用傳統的屬性來實現,不管什麼東西都有它的利與弊,只要我們適當的利用即可。
理論就說怎麼多,下麵咱們直接帖代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static void Test()
{
//傳統方式定義變數
string CustomerId = "客戶" ;
var NewCustomerId = "隱式類型" ;
var Age = 20;
var Array = new string [] { "111" , "222" };
object objectstring = "object" ;
Console.WriteLine( "傳統類型:" +CustomerId+ " " + "隱式類型" +NewCustomerId);
}
|