自动实现的属性是否会占用字段?

时间:2011-12-18 23:55:32

标签: c# properties c#-3.0

由于属性可以包含公共和私有getter / setter,是否仍然可以使用字段?通过设计get / set属性块来使用编译器使用的不可见变量并将这些字段全部保留下来,可以获得使用字段获得的任何行为吗?

5 个答案:

答案 0 :(得分:3)

不,自动实现的道具不会消除对支持字段的需求。有时,属性getter / setter会更有效,然后只需保存一个值。在许多情况下,您可能需要一个字段。一个很好的例子是在实现INotifyPropertyChanged进行绑定时。

像这样:

class someClass : INotifyPropertyChanged
{
// details omitted.....

    private int _myInt
    public int myInt { get { return _myInt; }
                       set { if ( value == _myInt ) return;
                             _myInt = value;
                             RaiseNotify("myIng");
                           }}
}
如果没有支持领域,这将是不可能的。

答案 1 :(得分:0)

人们为受保护和公共字段使用属性的主要原因是您可以在不破坏二进制兼容性的情况下添加行为。这意味着您的类使用(调用,子类等)的代码不需要重新编译。

没有必要为没有行为的私有成员使用属性。在这种情况下,您可以使用字段。如果您以后需要添加行为(使其成为属性),那么无论如何您将重新编译该类。

字段确实表现更好(虽然它取决于您拥有的JIT版本),因此除非有理由不这样做,否则应该使用它们。

编辑:

为了避免混淆:

字段:

private SomeType fieldName;

自动属性:

private SomeType fieldName { get; set; }

答案 2 :(得分:0)

自动实现的属性在简单的情况下不需要字段。

但是,如果要向属性设置器添加任何类型的逻辑或验证或事件,您仍需要一个字段。

答案 3 :(得分:0)

在大多数情况下,你可以使用autogen getter和setter而不是字段,但是有一个细微的区别:getter和setter是一个函数调用,即使内联 - 因此一个后备变量总是像它一样对应不稳定。

答案 4 :(得分:0)

虽然可以获取字段的值并设置字段,但是字段允许用户做一些无法用属性完成的事情:

  1. 可以修改字段的值,使新值取决于修改的确切时刻的旧值。这与读取属性,计算新值和写回来有不同的语义。
  2. 可以通过引用传递一个字段,然后可以自由地执行它们认为合适的任何读写序列,这些读取或写入都是“实时”发生的。同样,它具有不同的语义,即将属性的副本传递给方法,从方法接收修改后的副本,并将修改后的副本存储回原始文件。

如果想要以某种方式公开属性,以便能够使用它进行“类字段”事务,但是不暴露实际字段,可以使用一系列通用UseProperty方法,声明为: / p>

delegate TResult; FuncRef<T1, TResult>(ref T1);
ResultType UseProperty<ResultType>
  (FuncRef func)
  {return func(_field);}
delegate TResult; FuncRef(ref T1 p1, ref T2 p2>
ResultType UseProperty<ResultType, T1>
  (FuncRef<propertyType, T1, ResultType> func, ref T1 p1)
  {return func(_field, p1);}
delegate TResult; FuncRef(ref T1 p2, ref T2 p2, ref T3 p3>
ResultType UseProperty<ResultType, T1, T2>
  (FuncRef<propertyType, T1, T2, ResultType> func, ref T1 p1, ref T2 p2)
  {return func(_field, p1, p2);}

不幸的是,没有很好的方法在C#或vb中声明一系列这样的函数(即一个'通用'函数,它可以接受任意数量的'ref'参数,并使它们可用于被调用的代码)。太糟糕了,因为否则,在一些语言支持下,这种方法可以为控制信息访问提供一个非常好的范例(即它可以准备修改某些信息,允许一般代码修改信息,然后对修改后的信息采取行动信息,而不必创建任何新的对象实例。)