VS2010的“公共属性<propertyname> As <datatype>与Public var </datatype> </propertyname>

时间:2010-05-01 06:07:26

标签: vb.net visual-studio-2008 visual-studio-2010

在VS2008中,我曾经输入

Public Property <PropName> As <dataType> 

并点击Enter键,IDE编辑器会自动将其扩展为完整的属性块。

现在,根据我的理解,2010年的一个新功能是编译器会自动将上面的短语法“扩展”为与您习惯使用的完整属性GET AND SET子方法相同的IL代码。在编辑器中看到之前。

但是功能,这有什么不同,只是有一个公共类级变量?如果唯一的差异是它编译的内容,并且如果没有功能差异,那么新方法的效率是否低于旧方法,因为它涉及的代码多于只有类级别的内存变量?

Public <Variable> as <DataType>

我认为如果你不打算在你的属性后面有代码,那么它们基本上是相同的。我想diffrenece是他们只是添加了关键字“属性”但功能,他们没有差异,是吗?

5 个答案:

答案 0 :(得分:1)

在这种特殊情况下没什么区别,但我从不使用公共数据成员 - 任何需要在类外暴露的东西总是使用属性来完成。这意味着在声明它们时会有更多的工作,但是当你以后希望你有一个属性/访问器方法,因为你需要实现一些代码时,知道代码中的其他地方已经在使用你的属性会更容易。

在有人拉我之前,没有 - 无论如何都不一样......你可以使用参考来操纵公众成员......

答案 1 :(得分:1)

这与财产有用的原因密切相关。它们在类实现和使用它的客户端代码之间提供了一定程度的隔离。当您使用公共字段时,您无法轻松地重构字段的行为方式,客户端代码直接引用它。例如,将字段更改为属性需要重新编译使用它的所有客户端代码。

自动属性的用处在于它不会强迫您事先决定某天可能需要重构某个字段。您可以推迟决定,并随时将自动属性更改为具有自定义行为的显式属性。无需在客户端代码中进行任何更改。

JIT编译器确保自动属性与字段一样高效,它内联访问器方法调用。新的自动属性语法使其在您的手腕上与公共领域一样高效。这是一个完全的双赢,再也不再使用公共领域了。

答案 2 :(得分:0)

如果我理解你的问题,我不确定 但是已经讨论了公共类级别变量与属性的需求here

编辑:此外,如果你只是做get / set

,IDE /编译器可以让你轻松减少代码

e.g。 public string Name { get; set; },不要求您声明支持字段 但是,您必须使用该属性访问此成员(甚至在类中)。因为,编译器会为您生成一个支持字段。它的名字是未知的。

答案 3 :(得分:0)

另一个区别是属性是从其他控件(如DataGridView)访问的,它可以读取公共属性值而不是变量。

答案 4 :(得分:0)

Auto-Implemented PropertiesVB)与公共字段之间的主要区别是接口定义。

如果将来您决定向属性添加逻辑,则使用具有自动实现属性的类的代码不需要更改,而如果您使用字段,则必须将接口定义修改为属性

所以自动实现的属性使用公共字段的简单语法(没有完整的属性声明),但具有属性的灵活性。

一些示例

当前代码(C#):

class PersonA {
  public int Age;
  public int BirthYear;
}

class PersonB {
  public int Age { get; set; }
  public int BirthYear { get; set; }
}

Usage:
var john = new PersonA { Age = 30, BirthYear = 1980 };
var jane = new PersonB { Age = 20, BirthYear = 1990 };

如果将来您决定废弃Age setter并从BirthYear派生值,您可以轻松更新您的课程,而不会破坏任何当前的客户端代码。

class PersonA {
  public int Age { get { return Date.Now.Year - BirthYear; }; set { } };
  public int BirthYear;
}

class PersonB {
  public int Age { get { return Date.Now.Year - BirthYear; }; set { } };
  public int BirthYear { get; set; }
}

Usage:
var john = new PersonA { Age = 30, BirthYear = 1980 }; // broken when not recompiled
var jane = new PersonB { Age = 20, BirthYear = 1990 };