1. 程式人生 > >屬性賦初始值的四種寫法--C#6.0新特性

屬性賦初始值的四種寫法--C#6.0新特性

1 介紹

 在C# 6.0 語法出來前,屬性的賦初始值使用get;set;雖然已經相對於最原始的寫法簡潔了非常多,但是還不夠,還不夠,還不夠。。。今天剛好一直在想著前幾天朋友問我的有關屬性賦初始值的問題,便自己試了一下,感覺6.0提供了更好的寫法。

2 程式碼

 (1)原始寫法

     在不知道哪個版本的C# 中,提供了最原始的寫法。那麼上程式碼看一下

 private string _text = null;         public string text         {             get             {                 return _text;             }             set             {                 _text = value;             }         }

    這應該是最原始的寫法了,應該也算是最麻煩的一種寫法。但是,接下來所說的所有寫法,都算是語法糖,經過反編譯之後,還是寫成這種寫法。

(2)6.0之前的寫法

不得不提的是,巨硬真的是對開發者真的貼心,雖然經常會好心辦壞事。那麼看一下有了語法糖之後是怎麼寫的         public string text         {             get;             set;         }

可以明顯看出來,有了語法糖之後,真的是寫起來非常舒服。那麼就有一個問題:如果給屬性賦初始值,在6.0語法出來以前,據我所知有兩種

1 、建構函式

2、 不適用這個語法糖,用第一種寫法

按照微軟的貼心程度以及C#在語法糖的道路上越來越遠,在6.0就提供了新的語法糖

(3)屬性允許賦初始值

 手握這顆語法糖,那麼就可以使用新的寫法了,那麼來看一下:

   public string text         {             get;             set;         } = "王二狗";

可以明顯看出來,這種寫法是比較簡單的。不慌,還有一顆糖可以吃。

(4)在屬性/方法裡面使用Lambda表示式

 有了這顆糖,我們再來看一下怎麼寫:

   public string text => "二狗子";

 那麼這句是不是更簡潔了,在6.0中允許使用lambda表示式賦初始值,根據lambda的一系列規則之下,就是這個樣子了。具體lambda的規則,在這裡我就不再詳細解釋了。

3 例子

    上面只是最簡單的用法,那麼我們來舉個栗子吧。

    找個場景吧:在類裡 ,有一個屬性Text,屬性型別為string,

   public  string Text         {             get;             set;         }

    現在需要根據string是不是為空來對另一個屬性flag進行復制。那麼我們看一下應該怎麼寫

  (1)   原始寫法

  private bool _flag = true;         public bool flag         {             get             {                 if (Text == "")                 {                     return true;                 }                 return false;             }             set             {                 _flag = true;             }         }

使用最初的寫法來寫,以前也是一直都這麼寫的,確實是比較麻煩的,寫了幾次都記不住這個寫法。

(2)新語法

  public bool flag => Text == "" ? true : false;

  比較一下吧,想一想,兩種寫法比較一下 ,哪個好很顯然了。

4 總結

有些人數,C#的語法糖太多了,程式設計師都成了傻子了,但是實際用起來,還是會叫真香。

那麼,為什麼我不用2中(3)屬性允許賦初始值這種寫法呢? 因為水平有限,不會寫。 

--------------------------------------------------------------------------------------

開玩笑

   public bool flag         {             get;             set;         } = Text == "" ? true : false;

這種寫法中,Text不可引用非靜態欄位,這樣的情況下,那麼就需要將Text加上一個static,變為非靜態欄位。

好啦 就寫到這裡吧,如有不正確,請指正!