从C#3.0开始,有一种新的语法可以从属性中自动生成实例变量:
public string Foo { get; set; }
但是无法访问底层支持字段。所以我真的没有看到它的重点,因为声明相同的实例变量会产生相同的效果,而不需要调用“getter”和“setter”的开销。
public string Foo;
声明属性如:
public string Foo { get; }
或
public string Foo { set; }
完全没用,因为我们无法写resp。阅读该领域的内容。
有人对C#中的原因有很好的解释,他们已经付出了所有这些努力来引入这种语法糖吗?
编辑:人们似乎认为我混淆了田地和财产,所以让我澄清一下我所说的话。
如果您正在使用具有自动生成字段的属性:
public string Foo { get; set; }
然后没有意义,因为无论何时访问属性,每次访问属性时都会有get_Foo()
“getter”的开销调用,因为你没有做任何特别的事情。 “吸气鬼”并没有兴趣创造这个属性。创建该字段将完全相同,并且速度更快(优化明智)。
由于
答案 0 :(得分:4)
public string Foo { get; set; }
定义了一个属性
public string Foo;
定义了一个字段。
他们是不同的东西。当你真正想要一个属性而不是一个领域时,前者非常方便。
对于访问,您可以定义不同的访问级别:
public string Foo { get; private set; }
另见Difference between Property and Field in C# 3.0+
至于你的编辑,你所说的只有在以下情况才有意义:
如果上述任何一个不成立,那么你需要定义一个属性,即使该属性看起来像一个空存根。
然后,当您稍后决定向访问者添加逻辑时,您不会破坏依赖于您的字段为字段的所有客户端。
如果您的类可能是数据绑定的,则您需要立即使用属性,因为数据绑定机制会忽略字段。
答案 1 :(得分:3)
public string Foo;
是一个领域。
public string Foo { get; set; }
是一个属性。它们不是同一个东西,has been discussed之前。其中一个主要传播的优点是访问控制:get; private set;
经常被用作例子。
但是无法访问底层支持字段。
是的,通过调用getter来实现。如果要在本地访问它,请使用[this.]Propertyname
。
public string Foo { get; }
和
public string Foo { set; }
会给你编译器错误,因为你必须同时实现get
和set
。
答案 2 :(得分:2)
重点是让代码更简洁,减少输入。
在你的例子中:
public string Foo;
是字段并且与属性不同:
public string Foo { get; set; }
因此自动属性语法有用,有点等同于:
private string _foo;
public string Foo { get { return _foo; } set { _foo = value; } }
但是它没有创建好的名称,它使用在C#中无效的安全名称(但在IL中有效)。
财产开销虽然在技术上可行,但通常由JIT解决为直接现场访问。
属性通常也是大多数数据绑定框架的目标。在反思中,属性与字段不同。 WPF / WinForms数据绑定使用属性(不是公共字段)。大多数属性使用支持字段来存储数据。权衡的是,在课堂上,你仍然使用属性,而不是使用支持字段。实际上,在发布优化代码上,性能完全相同,因为JIT将它们解析为完全相同的东西。
答案 3 :(得分:2)
它本身毫无意义,但你可以这样做:
public string Foo { private set; get; }
其中有更多价值。
属性和字段也不一样。
答案 4 :(得分:0)
它使定义属性更快,代码更清晰。如果您不需要属性,则不要定义 - 但我建议不要使用public
字段。您可以创建属性private
并访问它除了返回IL定义的字段之外没有其他任何操作。此外,如果您需要在get
或set
中进行一些工作,那么您将不得不以某种方式定义支持值,无论是字段还是某个继承成员。