我们是否需要C#属性中的支持字段?

Sip*_*ipo 4 c# properties

注意:不是关于自动实现的属性的问题.自动实现的属性是关于getter和setter中没有逻辑的属性,而我在代码中非常清楚地表明存在一些逻辑.这不是重复,因为问题确实不同,答案也是如此.但是,我会在代码中插入一些特定的逻辑,以便更清楚.


我看到很多这个:

private int _age;
public object Age
{
    get
    {
        if(user.IsAuthorized)
        {
            return _age;
        }
    }
    set
    {
        if(value > 0 && value < 120)
        {
            _backingField = value;
        }
        else
        {
            Console.Write("Non-valid age");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但为什么我们需要支持领域呢?为什么不返回Property本身,如下所示?

public object Age
{
    get
    {
        if(user.IsAuthorized)
        {
            return Age;
        }
    }
    set
    {
        if(value > 0 && value < 120)
        {
            Age = value;
        }
        else
        {
            Console.Write("Non-valid age");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 7

好吧,返回属性本身会导致Stack Overflow异常:

public object Property 
{
    get
    {
        return Property;
    }
    set
    {
        Property = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

想像

  MyObject o = new MyObject();

  // cause Stack Overflow exception
  o.Property = null;
Run Code Online (Sandbox Code Playgroud)

很容易理解为什么:

  1. 设置Property = null电话set
  2. 哪个电话Property = value;又拨打电话set
  3. 哪个叫Property = value;...等等.

因此,如果属性存储某些值,则该值应存储在字段中(您需要一个字段),我们不能使用属性来存储自身.如果你想缩短代码,就像这样(自动属性):

  public object Property { 
    get; // let .Net create a backing field for you
    set;
  }
Run Code Online (Sandbox Code Playgroud)


ody*_*jii 5

该属性实际上只有两个隐藏方法:get_Propertyset_Property。如果您Property从 getter返回Property,实际上会导致无限递归循环,这将导致堆栈溢出异常:您正在get_Property从 method调用该方法get_Property,而 method 又调用get_Property等等。

编辑:正如评论中所澄清的,该属性只是两个方法,仅此而已。没有任何东西可以保存数据;支持字段是实际包含数据的字段。如果您想将Age数据存储在实例中,则必须有某个东西保存该数据,这就是您需要支持字段的原因。

自动属性自动创建支持字段:

public object Property { get; set; }
Run Code Online (Sandbox Code Playgroud)

在所有其他情况下,属性只是两个方法,所有数据存储都是单独的,您必须自己处理。

  • 这并没有回答有关“支持字段”用途的问题。 (2认同)