0

从 C# 3.0 开始,有新的语法可以从属性自动生成实例变量:

public string Foo { get; set; } 

但是没有办法访问底层的支持字段。所以我真的不明白它的意义,因为声明相同的实例变量会产生相同的效果,而无需调用“getter”和“setter”的开销。

public string Foo;

像这样声明属性:

public string Foo { get; } 

或者

public string Foo { set; } 

完全没用,因为我们无法编写相应的代码。阅读该字段的内容。

有人能很好地解释为什么在 C# 中他们付出了所有努力来引入这种语法糖吗?

编辑:人们似乎认为我混淆了字段和属性,所以让我澄清一下我所说的话。

如果您使用具有自动生成字段的属性:

public string Foo { get; set; } 

那么就没有意义了,因为每当您访问属性时,每次访问属性时都会对get_Foo()“getter”进行开销调用,并且由于您没有在“getter”中做任何特别的事情,所以没有糊状创建此属性的兴趣。创建字段将完全相同,并且速度更快(优化)。

谢谢

4

5 回答 5

4

public string Foo { get; set; }定义一个属性。
public string Foo;定义一个字段。

它们是不同的东西。当你真正想要一个属性而不是一个字段时,前者非常方便。

至于访问,您可以定义不同的访问级别:

public string Foo { get; private set; }

另请参阅C# 3.0+ 中属性和字段之间的区别


至于您的编辑,您所说的只有在以下情况下才有意义:

  1. 您 100% 确定您的属性访问器永远不会包含任何实际逻辑。
  2. 您 100% 确定您的字段永远不会被数据绑定。

如果上述任何一项不正确,那么您需要定义一个属性,即使该属性看起来像一个空存根。
然后,当您稍后决定向访问器添加逻辑时,您不会破坏所有依赖您的字段作为字段的客户端。
如果你的类可能是数据绑定的,你需要一个属性,因为数据绑定机制会忽略字段。

于 2012-07-25T13:50:01.260 回答
3
public string Foo; 

是一个字段。

public string Foo { get; set; }

是一种财产。它们不是同一个东西,之前已经 讨论 。主要传播的优点之一是访问控制:经常用作示例。get; private set;

但是没有办法访问底层的支持字段。

是的,通过调用吸气剂。[this.]Propertyname当您想在本地访问它时使用。


public string Foo { get; } 

public string Foo { set; } 

会给你编译器错误,因为你必须同时实现getset.

于 2012-07-25T13:50:57.753 回答
2

这样做的目的是使代码更简洁,减少输入。

在您的示例中:

public string Foo;

是一个字段,与属性不同:

public string Foo { get; set; }

所以 auto-property 语法是有用的,在某种程度上相当于:

private string _foo;
public string Foo { get { return _foo; } set { _foo = value; } }

但是它不会创建好的名称,它使用在 C# 中无效的安全名称(但在 IL 中有效)。

尽管在技术上是可能的,但属性开销通常由 JIT 解决,以直接访问字段。

属性通常也是大多数数据绑定框架的目标。在反射中,属性不同于字段。WPF / WinForms 数据绑定使用属性(不是公共字段)。大多数属性使用支持字段来存储数据。权衡是在课堂上时,您仍然使用属性而不是使用支持字段。实际上,在发布优化代码上,性能与 JIT 将它们解析为完全相同的东西完全相同

于 2012-07-25T13:50:11.253 回答
2

它本身没有意义,但你可以这样做:

public string Foo { private set; get; } 

这有更多的价值。

属性和字段也不是一回事。

于 2012-07-25T13:51:18.220 回答
0

它使定义属性更快,代码更简洁。如果您不需要属性,则不要定义一个 - 但我建议不要使用public字段。您可以创建属性private并访问它除了返回 IL 定义的字段之外没有任何作用。此外,如果您需要在getor中做一些工作,set那么您将不得不以某种方式定义一个支持值,无论是一个字段还是某个继承的成员。

于 2012-07-25T13:52:13.470 回答