這必須被問了很多次,但我不能找到它....對不起(VS 2010 C#)...爲什麼{獲得;設置;}沒有初始值存取
爲什麼以下不允許?
public string MyString =「initial value」{get;私人設置;}
(Visual C#Express 2010)
這必須被問了很多次,但我不能找到它....對不起(VS 2010 C#)...爲什麼{獲得;設置;}沒有初始值存取
爲什麼以下不允許?
public string MyString =「initial value」{get;私人設置;}
(Visual C#Express 2010)
在2017年VS您可以:
public int Minimum { get; private set; } = 0;
public int Maximum { get; set; } = 5;
這是一個屬性,而不是一個字段。你不能這樣初始化它。只需在構造函數中設置值即可。
這只是無效的語法。不幸的是,你無法初始化自動屬性的值。
最佳的選擇是要麼使手動屬性:
private string _MyString = "initial value";
public string MyString { get { return _MyString; } set { _MyString = value; } }
或在構造初始化值:
public string MyString { get; set; }
....
public MyClass() {
MyString = "initial value";
}
我明白有很多種方法。我只是想知道爲什麼沒有合適的有效語法(還)。上述方法的問題是聲明和初始化是分開的,可能由許多代碼行組成,我喜歡@ apollodude217的語法如下 – Paulustrious 2017-01-16 20:04:20
一種替代:
string _strMyString;
public string MyString
{
get {
if (String.IsNullOrEmpty(_strMyString) {
return "initial value";
} else {
return _strMyString;
}
}
String.IsNullOrEmpty – Tergiver 2010-07-16 17:18:57
我總是忘記這種方法。 – 2010-07-16 17:25:24
當您將其設置爲空字符串時,OrEmpty會破壞您的應用程序。 – 2012-03-13 15:08:37
語法
public string MyString { get; set; }
換舊風格/煩人/小事(如VS2008中/ C#3.0,你可以看到所有的C#3.0 here的新功能)
private string _MyString;
public string MyString
{
get { return _MyString; }
set { _MyString = value; }
}
編譯器實際上是編譯代碼之前生成的成員。 您可以打開反射器並查看生成的成員。
爲什麼?
我無法代表C#的設計師說,但我可以作出明智的猜測:
這就是說,這裏是我怎麼會允許值(當一組訪問是可用的,當然):
public string MyProp {get;set;} = "initial value"; // not valid C#
未做語言的任何更復雜,他們可以寫的規則,使它適用於「[所有人]與set訪問性」,而不是「用set訪問默認屬性」:
// again, not valid C#:
public string MyProp
{
get { return _MyProp;}
set { _MyProp = value; }
} = "initial value before being massaged or rejected by the set accessor.";
我在這裏看到的唯一的缺點是,它是醜陋的。好處是你可以用屬性簡單地指定一個屬性的初始值,而不是在構造函數中,並且你可以讓該值在運行時通過構造函數進行按摩/檢查/如果你願意的話。
我更喜歡你的語法,直到我看到{lost of code – Paulustrious 2017-01-01 17:28:53
對不起 - 沒有足夠的'聲譽'編輯我自己的評論後,忘記CR張貼消息。 – Paulustrious 2017-01-01 17:31:23
你是對的! – Paulustrious 2017-06-24 16:06:59
不幸的是,是不可能做到現 - 但它不會損害到添加的功能在未來的C#版本 - 我希望他們不要將其添加在未來。 (並且增加了只讀自動屬性的功能) – 2010-07-16 15:03:01
如果我們可以標記具有自動備份字段的屬性以使後備字段爲「只讀」,那將會特別好。此時,我們可以通過屬性初始化,但只能在構造函數中初始化。這已經在SO之前討論過了。 – 2010-07-16 15:06:19
最後,VB允許使用更簡潔的語法!在VB10中,'Public Property MyString As String =「initial value」'起作用。 – Heinzi 2010-07-16 18:02:56