自动生成instvar有什么意义?

时间:2012-07-25 13:48:08

标签: c# properties auto-generate

从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”的开销调用,因为你没有做任何特别的事情。 “吸气鬼”并没有兴趣创造这个属性。创建该字段将完全相同,并且速度更快(优化明智)。

由于

5 个答案:

答案 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. 您100%确定您的属性访问器永远不会包含任何实际逻辑。
  2. 您100%确定您的字段永远不会受到数据限制。
  3. 如果上述任何一个不成立,那么你需要定义一个属性,即使该属性看起来像一个空存根。
    然后,当您稍后决定向访问者添加逻辑时,您不会破坏依赖于您的字段为字段的所有客户端。
    如果您的类可能是数据绑定的,则您需要立即使用属性,因为数据绑定机制会忽略字段。

答案 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; } 

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

答案 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定义的字段之外没有其他任何操作。此外,如果您需要在getset中进行一些工作,那么您将不得不以某种方式定义支持值,无论是字段还是某个继承成员。