2010-07-16 85 views
4

這必須被問了很多次,但我不能找到它....對不起(VS 2010 C#)...爲什麼{獲得;設置;}沒有初始值存取

爲什麼以下不允許?

public string MyString =「initial value」{get;私人設置;}

(Visual C#Express 2010)

+1

不幸的是,是不可能做到現 - 但它不會損害到添加的功能在未來的C#版本 - 我希望他們不要將其添加在未來。 (並且增加了只讀自動屬性的功能) – 2010-07-16 15:03:01

+1

如果我們可以標記具有自動備份字段的屬性以使後備字段爲「只讀」,那將會特別好。此時,我們可以通過屬性初始化,但只能在構造函數中初始化。這已經在SO之前討論過了。 – 2010-07-16 15:06:19

+0

最後,VB允許使用更簡潔的語法!在VB10中,'Public Property MyString As String =「initial value」'起作用。 – Heinzi 2010-07-16 18:02:56

回答

1

在2017年VS您可以:

public int Minimum { get; private set; } = 0; 
    public int Maximum { get; set; } = 5; 
1

這是一個屬性,而不是一個字段。你不能這樣初始化它。只需在構造函數中設置值即可。

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"; 
} 
+0

我明白有很多種方法。我只是想知道爲什麼沒有合適的有效語法(還)。上述方法的問題是聲明和初始化是分開的,可能由許多代碼行組成,我喜歡@ apollodude217的語法如下 – Paulustrious 2017-01-16 20:04:20

2

一種替代:

string _strMyString; 

public string MyString 
{ 
    get { 
     if (String.IsNullOrEmpty(_strMyString) { 
      return "initial value"; 
     } else { 
      return _strMyString; 
     } 
} 
+0

String.IsNullOrEmpty – Tergiver 2010-07-16 17:18:57

+1

我總是忘記這種方法。 – 2010-07-16 17:25:24

+3

當您將其設置爲空字符串時,OrEmpty會破壞您的應用程序。 – 2012-03-13 15:08:37

1

語法

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; } 
} 

編譯器實際上是編譯代碼之前生成的成員。 您可以打開反射器並查看生成的成員。

1

爲什麼?

我無法代表C#的設計師說,但我可以作出明智的猜測:

  1. 他們想看看到底有多大的交易是抽空 前再添功能和另一個規則的語言。
  2. 他們找不到足夠優雅的方式來做到這一點。

這就是說,這裏是我怎麼會允許值(當一組訪問是可用的,當然):

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."; 

我在這裏看到的唯一的缺點是,它是醜陋的。好處是你可以用屬性簡單地指定一個屬性的初始值,而不是在構造函數中,並且你可以讓該值在運行時通過構造函數進行按摩/檢查/如果你願意的話。

+0

我更喜歡你的語法,直到我看到{lost of code – Paulustrious 2017-01-01 17:28:53

+0

對不起 - 沒有足夠的'聲譽'編輯我自己的評論後,忘記CR張貼消息。 – Paulustrious 2017-01-01 17:31:23

+0

你是對的! – Paulustrious 2017-06-24 16:06:59