Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在owner类中使用属性vs backing字段_C#_Properties_Automatic Properties - Fatal编程技术网

C# 在owner类中使用属性vs backing字段

C# 在owner类中使用属性vs backing字段,c#,properties,automatic-properties,C#,Properties,Automatic Properties,我喜欢C#中自动实现的属性,但最近有一头大象站在我的隔间里,我不知道该拿他怎么办 如果我使用自动实现的属性(以下简称“aip”),那么我就不再有内部使用的私有支持字段。这很好,因为aip没有副作用。但是,如果以后我需要在get或set中添加一些额外的处理呢 现在我需要创建一个支持字段,以便扩展getter和setter。这对于使用该类的外部代码来说很好,因为它们不会注意到差异。但是现在所有对aip的内部引用都将在访问属性时调用这些副作用。现在,必须重构对once aip的所有内部访问,以使用ba

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

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

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

所以我的问题是,你们大多数人做什么?您是使用自动实现的属性还是希望始终使用备份字段?您对有副作用的特性有何看法?

回答了这个问题:

如果动机是什么 从自动执行更改 要显式实现的属性 属性用于更改语义 那么你应该 评估所需的语义是否正确 从访问属性时 在类内与或相同 与期望的语义不同 从访问属性时 课外活动

如果调查结果是 “在课堂上,学生们所期望的 访问此属性的语义 与期望的不同 访问属性的语义 从外部”,则您的编辑 引入了一个bug。你应该修好窗户 缺陷如果它们是相同的,那么您的 编辑没有引入错误;保持 执行情况也一样


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

public string Name 
{
    get; set;
}
private string name;

public string Name 
{
    get { return this.name; }
    set 
    {
       if (!string.IsNullOrEmpty(value))
       { 
           this.name = value;
       }
    }
}
如果您将来需要一些额外的处理,只需修改您的属性:

public string Name 
{
    get; set;
}
private string name;

public string Name 
{
    get { return this.name; }
    set 
    {
       if (!string.IsNullOrEmpty(value))
       { 
           this.name = value;
       }
    }
}

在将命令与问题分开方面,具有具有副作用的属性并不是很好。我希望我的对象能够以同样的方式回答问题,只要我没有调用任何方法来明确说明某些内容可能会发生变化。

我总是使用AIP,直到我需要一个支持字段为止。交换并不难:

public string MyString{get;set;}
为了


我认为总是使用后者是不必要的混乱。

首先,属性获取程序不应该有副作用。情况并非总是如此,但你应该有一个很好的理由证明情况并非如此


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

虽然我一直是EL博客链接的粉丝,但这个答案实际上并没有告诉海报什么。他的假设情况是逻辑不同;这不是一个他必须问自己的问题。我尊重地不同意-这是一个语义问题,如果你需要直接使用支持字段而不使用属性,而你以前从未需要这样做,那么你正在破坏一些东西。他的场景是,他正在改变getter的语义。他已经说过他正在破坏某些东西,因为他不希望自己的内在逻辑受制于添加到getter中的任何东西。他的问题是“在这种情况下,我该怎么办?”,你的大部分引文都是关于做出决定的。事实上,这在我的脑海中由来已久,并不是因为我目前正在做任何特定的代码更改。这是一个预防性的研究,因为我正在开始一个新的项目,并试图把事情做得“正确”。自C#3.0以来,我一直使用AIP,但我的大多数同事不这么做。我继承了很多可以从使用AIP中获益的代码,但我想知道是否有一个很好的理由不这么做。所以我只是在寻求意见。这实际上只适用于get;一边布景;附带定义有副作用。我对副作用的理解是,每次调用getter时,支持字段都会发生更改。i、 e.获取{u field++;}。但是,当您想要触发像OnPropertyChanged()这样的事件时,该怎么办?这被认为是副作用吗?如果您的内部逻辑需要对支持字段执行三次数学运算以获得最终值,您肯定不希望PropertyChanged事件触发三次。副作用也很有用:延迟加载。@whatispunk:这是一个指导原则;延迟加载显然是一个例外,但是用户应该意识到获取属性可能是一个昂贵的操作,因为属性是非常轻量级的,重量级操作被转移到方法中。也就是说,获取属性值的IMHO不应该在同一对象上引发
PropertyChanged
事件,也不应该(理想情况下)影响另一个属性的值,因为在访问或设置属性的顺序背后不应该有逻辑。你是对的。我真的没有想清楚。Getter永远不会调用PropertyChanged。问题是在进行此更改时要做什么(或如何计划),在类中引入了额外的(不需要的)逻辑,而不是如何进行更改。是的,我知道以前有人问过类似的问题。我确实使用了谷歌,特别是搜索StackOverflow,但我没有找到一个明确的/令人满意的答案。所以我用我自己的话回答了这个问题