关于vb.net:VS2010的“公共属性< PropertyName> As< DataType>与Public var

VS2010's "Public Property <PropertyName> As <DataType> vs. Public var

用VS2008中,I型

1
Public Property <PropName> As <dataType>

和点击回车键和IDE编辑器会自动将它吹到一块完整的物业。

现在,从我的理解,一个新的特征,这是学院2010年"expands编译器自动进入"短语法相同的IL代码。你会得到一个完整的get方法和set属性子这是一个accustomed看到之前在编辑器。

但功能如何,这是任何不只是尾部有一个公共类级变量吗?如果唯一的不同就是它compiles到如果没有otehrwise功能差,不新不旧的方式,因为它效率比自然更多的代码,不只是有一个一流的内存变量?

1
Public <Variable> as <DataType>

我认为如果你知道你要在有属性的代码,他们都太不一样了。我猜那是他们只是diffrenece加关键字"物业"的功能,但不同的是,他们没有,嗯?


这与为什么属性是有用的紧密联系在一起。它们提供了类实现和使用它的客户机代码之间的隔离级别。当使用公共字段时,您不能轻易地重构字段的行为方式,客户机代码直接引用它。例如,将字段更改为属性需要重新编译所有使用它的客户机代码。

自动属性的有用性在于它不会强迫您提前决定某个字段某天可能需要重构。您可以推迟决定,并在任何时候使用自定义行为将其从自动属性更改为显式属性。无需对客户机代码进行任何更改。

JIT编译器确保自动属性与字段一样高效,它会引入访问器方法调用。新的自动属性语法使它在手腕上的效率与公共字段一样高。这是一个完全双赢的局面,再利用一个公共领域也没有任何意义。


在这种特殊情况下,它没有什么区别,但我从不使用公共数据成员——任何需要在类外部公开的内容都是用属性完成的。这意味着在声明它们时要做更多的工作,但是稍后如果您希望有一个属性/访问器方法,因为您需要实现一些代码,那么很容易知道代码中的其他地方已经在使用您的属性…

在有人把我拉上来之前,不-无论如何都不一样…例如,可以使用引用来操纵公共成员…


自动实现属性(vb)和公共字段的主要区别在于接口定义。

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

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

举个例子:

当前代码(C):

1
2
3
4
5
6
7
8
9
10
11
12
13
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 };

如果将来您决定放弃年龄设置器并从出生年份中获取值,那么您可以轻松地更新类,而不必破坏任何当前客户机代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
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 };

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


我不确定,如果我正确理解你的问题。但是这里已经讨论了公共类级变量vs属性的需求。

编辑:此外,如果您只是执行get/set,那么IDE/compiler使您很容易减少代码。

例如public string Name { get; set; },不需要声明支持字段。但是,您必须使用该属性访问这个成员(甚至在类内部)。因为编译器会为您生成一个支持字段,其名称未知。