代码之家  ›  专栏  ›  技术社区  ›  mikesigs

在所有者类中使用属性vs backing字段

  •  8
  • mikesigs  · 技术社区  · 14 年前

    我喜欢C中自动实现的属性,但最近有一头大象站在我的隔间里,我不知道该拿他怎么办。

    如果我使用自动实现的属性(以下简称“aip”),那么我就不再有一个在内部使用的私有备份字段。这很好,因为aip没有副作用。但是如果以后我需要在get或set中添加一些额外的处理呢?

    现在我需要创建一个backing字段,这样我就可以扩展getter和setter。对于使用类的外部代码来说,这很好,因为它们不会注意到差异。但是现在所有对aip的内部引用都将在访问属性时调用这些副作用。现在,对once aip的所有内部访问都必须经过重构才能使用backing字段。

    所以我的问题是,你们大多数人都做什么?您是使用自动实现的属性,还是希望始终使用备份字段?你觉得有副作用的房产怎么样?

    5 回复  |  直到 14 年前
        1
  •  6
  •   Andrew Hare    14 年前

    Eric Lippert has an excellent blog post 回答了这个问题:

    如果动机是什么 从自动实现的更改 要显式实现的属性 属性更改语义 那么你应该 评估所需的语义 从访问属性时 在类内与或相同 不同于期望的语义 从访问属性时 在教室外面。

    如果调查结果是 在班里, 访问此属性的语义 与期望的不同 访问属性的语义 从外面看,你的编辑 引入了一个错误。你应该修好 缺陷。如果它们是一样的,那么 编辑没有引入错误;保持 执行相同。

        2
  •  3
  •   Adam Robinson    14 年前

    首先, 属性getter不应该有副作用 . 情况并不总是这样,但你应该有一个很好的理由不这样。

    也就是说,获取对属性的引用列表很简单。如果您更改为显式属性并希望您的私有代码访问新的支持变量,则应该很容易进行修改。

        3
  •  1
  •   Andrew Bezzub    14 年前

    我认为使用自动实现的属性没有任何问题。假设你有一些财产:

    public string Name 
    {
        get; set;
    }
    

    如果您将来需要一些额外的处理,只需修改您的属性:

    private string name;
    
    public string Name 
    {
        get { return this.name; }
        set 
        {
           if (!string.IsNullOrEmpty(value))
           { 
               this.name = value;
           }
        }
    }
    
        4
  •  0
  •   flq    14 年前

    从命令和问题分离的角度来看,拥有带有副作用的属性并不是很好。我更希望我的对象以同样的方式回答问题,只要我没有调用任何方法来清楚地说明某些事情可能会改变。

        5
  •  0
  •   Joel    14 年前

    我总是用aip直到我需要一个后场。交换一下并不难:

    public string MyString{get;set;}
    

    对于

    private string myString;
    public string MyString{get{return myString;} set{myString = value;}}
    

    我认为总是给后者带来麻烦是不必要的。