2010-07-16 86 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