2017-03-09 75 views
3

我已經開始使用VS2017社區。這個錯誤我:C#中的Getter setter VS2017

下面是從以前的VS正常的getter setter方法:

public string Name 
    { 
     get{ return _name;} 
     set{ _name = value;} 
    } 

這是新的getter setter方法:

public string Name { get => _name; set => _name = value; } 

任何人都可以向我解釋爲什麼語法改變了嗎?

回答

0

你會注意到他們刪除了'return'語法,這已經完成了(從我讀過的),使它更清楚地表明它們不是函數(並且當反射不能被當作函數和不能成爲代表),而是這種'僞功能'(如果你得到我想要得到的)。

所以基本上它更清楚getter is linking this this variable和重複的setter。這也是因爲在新版本中,你可以這樣做

public int MyInt => x ? y:z;

代表

public int MyInt 
{ 
    get 
    { 
     return x ? y:z; 
    } 
} 

還兼有語法應該工作,它只是一個新的語法,他們加入到與看齊上面的例子。

1

語法沒有改變:它已被改進。 C#始終與以前版本的語法和語法向後兼容。

爲什麼屬性獲取器/設置器可以用lambda語法(表達式體訪問器)實現?可能沒有這樣做的科學理由,但在C#中引入有用的函數式編程結構方面存在共識,因爲它將語言轉變爲更高效的工具。

只是foillow了C#的演變,因爲C#2.0:

  • 從作爲常規方法以匿名委託提供委託。
  • LINQ,lambda風格的委託/表達式樹。
  • 表達式的方法。
  • ...和表達式訪問!未來的C#版本可能會引入更多功能性的編程風格語法和語法。
2

我不會說他們改變了它,我會說他們給了我們一些新的語法選項。您仍然可以使用「舊」方式來聲明getter和setter,但現在也有一種更實用的編程風格。在C#6微軟使用的getter屬性只有在做表情已經介紹:

public int SomeProp => someMethod(); 

C#7增強了這種支持允許它被用於getter和setter。其中一個很好的特性是新的「throw表達式」功能,它使我們能夠製作一些簡潔的語法。例如,在你不得不這樣做之前。

private string _name; 
public string Name 
{ 
    get 
    { 
     return _name; 
    } 
    set 
    { 
     if (value == null) 
      throw new ArgumentNullException(nameof(Name)); 
     _name = value; 
    } 
} 

現在,我們可以簡化這個到:

private string _name; 
public string Name { 
    get => _name; 
    set => _name = value ?? throw new ArgumentNullException(nameof(Name)); 
} 

當然,你可以做拋表達即使不使二傳手拉姆達但你可以看到,對於簡單的事情,它使語法非常簡潔。

正如任何事情,使用是很有道理的給你,是最可讀的誰將會編碼應用程序中的人的語法。微軟一直在推動爲C#增加更多功能的編程風格功能,這只是另一個例子。如果您發現它很醜陋/令人困惑/不需要,您可以完全用現有方法完成您需要的一切。又如,爲什麼我們有whiledo while循環?我可以誠實地說我在我的職業生涯中曾經使用過一次do while循環。一個while循環可以完成一切do while可以只是用不同的語法。但是,有時您會意識到使用do while將使您的代碼更具可讀性,所以爲什麼不使用該代碼?