Pav*_*nin 0 c# language-design c#-6.0
更新1
看起来我的英语非常糟糕,或者人们只是不吝啬...了解我的要求或只是看帖子的标题.
C#5规范明确规定:
由于支持字段不可访问,因此只能通过属性访问器读取和写入,即使在包含类型中也是如此.这意味着自动实现的只读或只写属性没有意义,并且是不允许的.
public string MyProperty {get;}没有任何意义,但编译器发出getter甚至没有对缺乏setter的争论也没有任何代价.备用字段将使用默认值进行初始化.这是什么意思?这意味着设计人员花了一些精力来实现验证,以引入可能遗漏的功能.
我们现在考虑C#6:
在C#6中,引入了自动实现属性的初始化.
public string FirstName { get; set; } = "Jane";
Run Code Online (Sandbox Code Playgroud)
要么
public string FirstName { get; } = "Jane";
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,属性也可以在构造函数中设置:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
}
public Program()
{
ImagePath = "";
}
}
Run Code Online (Sandbox Code Playgroud)
但只能在声明属性的类的构造函数中.派生类不能设置属性的值.
现在问问自己这个属性意味着什么,如果它没有在构造函数中初始化:
property string My {get;}
Run Code Online (Sandbox Code Playgroud)
这是C#5禁止财产的100%等价物.没有任何意义.
但是这种在C#5中无效的声明在C#6中变得有效.然而,语义根本没有改变:没有显式初始化,这个属性是无用的.
这就是我要问的原因:
为什么不在c#6中显式初始化readonly自动实现的属性?
我希望看到的答案是:
我发现答案It's by design完全无关紧要.这只是一个事实.我寻找原因.我不相信编译器设计者只需抛硬币就可以决定编译器行为的变化.
这是一个很好的答案的例子.
原始问题
在VS2015中,此代码编译时没有错误:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
Console.WriteLine("Hello World");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在VS2013中,我收到错误:
编译错误(第5行,第28栏):'Program.ImagePath.get'必须声明一个正文,因为它没有标记为abstract或extern.自动实现的属性必须定义get和set访问器.
我知道可初始化的自动实现的属性,并且在VS2015字段获得默认值的情况下,就null在这里.但是有趣的是,知道为什么这个片段在C#5中无效?
readonly没有显式初始化的可初始化自动实现属性在我看来有点奇怪.这可能是一个错误,而不是意图.在这种情况下,我个人更喜欢编译器要求显式初始化:
public string ImagePath { get; } = default(string);
好的,我知道这样的属性也可以在构造函数中分配:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
}
public Program()
{
ImagePath = "";
DoIt();
}
public void DoIt()
{
//ImagePath = "do it";
}
}
public class My : Program
{
public My()
{
//ImagePath = "asdasd";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果编译器可以检查本地变量是否未初始化,则属性也是如此.
那它为什么会这样呢?
编译器告诉您自动属性必须同时定义两个访问器.例如,您可以使用修复错误
public string ImagePath { get; private set; }
Run Code Online (Sandbox Code Playgroud)
假设您不打算在课堂外设置该属性.
至于为什么你必须声明一个setter或手动实现该属性 - 那么,你可以读取的属性有什么好处,但是总是返回它的类型的默认值,因为没有办法设置它?相反,你可以写一个属性有什么好处,但既不能读取也不能挂钩它的二传手?
C#6.0为您提供了一次写入,读取许多自动属性的选项; 这是一个巨大的差异,因为可以任意选择该值,从而为您提供具有不可变值的属性的方便语法.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |