Quantcast
Channel: 黑暗執行緒
Viewing all articles
Browse latest Browse all 2311

筆記:C# 6.0 自動實作屬性初始化與運算式主體定義

$
0
0

專案裡有個在父類別宣告 virtual List<string> MyProp { get; } = new List<string>(); ,接著在子類別 override MyProp, Visual Studio 2017 自動帶出 List<string> MyProp => base.MyProp; 。(術語為 Expression Body Definition 運算式主體定義)

子類別要傳回 "Prod1","Prod2" ,我差一點就接改成 List<string> MyProp  => "Prod1,Prod2".Split(',').ToList();,仔細想想不對,我的本意是要給 MyProp 屬性初始值,沿用 => 寫法變成每次產生新字串陣列,意義不同,差點搞錯。為此趕緊寫篇筆記壓壓驚!

來個範例:

using System;
 
publicclass Blah
{
    private Guid _prop1 = Guid.NewGuid();
public Guid Prop1
    {
get
        {
return _prop1;
        }
    }
public Guid Prop2 { get; } = Guid.NewGuid();
 
public Guid Prop3
    {
get
        {
return Guid.NewGuid();
        }
    }
public Guid Prop4 => Guid.NewGuid();
 
}
 
static void Main(string[] args)
{
    var blah = new Blah();
    Console.WriteLine($"Prop1={blah.Prop1},Prop2={blah.Prop2}");
    Console.WriteLine($"Prop1={blah.Prop1},Prop2={blah.Prop2}");
    Console.WriteLine($"Prop3={blah.Prop3},Prop4={blah.Prop4}");
    Console.WriteLine($"Prop3={blah.Prop3},Prop4={blah.Prop4}");
    Console.Read();
}

在以上範例中,Prop1 與 Prop2 意義相同,都是物件建立時給予屬性初始值,屬性值固定不變;Prop3 與 Prop4 則偏向動態性質,每次呼叫時都重新產生新值。其中 Prop2 與 Prop4 是 C# 6.0 起支援的新寫法,較傳統寫法簡潔。

實測結果如下,Prop1/Prop2 兩次呼叫結果相同,Prop3/Prop3 每次讀取都會拿到新的 GUID。

Prop1=9a818bfa-7789-4dc3-8eab-a1c526cdf6c3,Prop2=d09ae5a4-01e8-41fa-a888-b508c974e463
Prop1=9a818bfa-7789-4dc3-8eab-a1c526cdf6c3,Prop2=d09ae5a4-01e8-41fa-a888-b508c974e463
Prop3=76e8b7ac-0830-4715-9d78-6840e7d59b3e,Prop4=922858c2-294c-4178-8a74-bd7bef385eb2
Prop3=1af010c8-a926-4e17-ad77-83d481227171,Prop4=03a8ea07-cc09-42fc-b37d-77c9d6c087d6

【延伸閱讀】

Viewing all articles
Browse latest Browse all 2311

Trending Articles