8

查看新的 VB 2010 功能,我偶然发现了对Auto-Implemented Properties的支持。

由于我正在使用 C#,这似乎很熟悉,但我注意到 VB 确实添加了我希望在 C# 中拥有的功能:为自动实现的属性设置任意默认值:

Public Class Person

    Property Name As String = "Scott Guthrie"
    Property Age as Integer = 35

End Class

我真的很喜欢在 C# 中干净地使用自动属性。这将节省我们每次只需要一个默认值时引入支持字段并将其连接到属性的工作,从而不必要地混乱代码。

我想知道为什么这也没有在 C# 中引入?不这样做的理由是什么?是否正在进行语法讨论,或者实施此操作是否存在技术限制?

4

4 回答 4

9

为什么不在构造函数中默认它们?这也是它的用途。

于 2010-04-13T08:23:30.877 回答
4

关于什么:

public class Person
{
    public Person() 
    {
         this.Name = "Scott Guthrie";
         this.Age = 35;
    }
    public string Name { get; set; }
    public string Age { get; set; }
}

我相信,在实践中,这归结为相同的并且不是那么多额外的工作。但也许,在很长一段时间内,VB 看起来比 C# 更清晰...... ;-)

编辑(基本原理):
您在您的原始问题下(和中)的最后评论中询问基本原理。大声思考,我认为 C# 中初始化代码只去一个地方和一个地方,即构造函数的原则是这个决定的原因。添加另一个必须查找初始化代码的位置会使调试变得更加困难,代码也变得不那么清晰。

显然,内联初始化值不能包含其他初始化或计算(至少,非常有限)。虽然我同意 VB 方式可以更简洁,但如果 C# 团队和 Anders Hejlsberg 说他们认为拥有一个初始化位置是一个更大的优势,我会理解他们。

编辑: 这是微软所说的。简而言之,不是针对 C# 4.0,而是针对 C# 5.0?还:

“虽然这并不像听起来那么容易:接下来你想要的是构造函数初始化支持字段,但它只能通过 setter 来完成,这可能不是你想要的。”

和(只是评论者):

“缺乏初始化或构造函数控制使得该功能对于返回引用类型的属性实际上毫无价值。”

于 2010-04-13T08:27:28.950 回答
0

虽然我不是微软,但我建议感知的好处低于实施、测试和支持该功能的成本。

当然,您可以通过声明构造函数来设置默认值,但我同意 VB 语法更清晰一些(特别是如果您要使用元数据来装饰它,例如<DefaultValue(...)>

于 2010-04-13T08:24:38.457 回答
0

对于将自动属性转换为带有支持字段的属性的繁琐业务,我有一个解决方案:我的插件AtomineerUtils将通过一个按键为您进行重构。

于 2010-04-13T08:35:05.317 回答