这必须被问了很多次,但我不能找到它....对不起(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