C# 未更改的值和自动实现的属性

C# 未更改的值和自动实现的属性,c#,properties,C#,Properties,实现简单属性时,您可以使用,使代码看起来更简单,如下所示: public int MyInt { get; set; } 或者您可以使用“手动”专用字段来实现它。在这种情况下,我经常看到人们在使用set之前检查值的变化。像这样: private int _myInt; public int MyInt { get { return _myInt; } set { if value != _myInt _myInt =

实现简单属性时,您可以使用,使代码看起来更简单,如下所示:

public int MyInt
{
    get; set;
}
或者您可以使用“手动”专用字段来实现它。在这种情况下,我经常看到人们在使用
set
之前检查值的变化。像这样:

private int _myInt;

public int MyInt
{
    get { return _myInt; }
    set 
    {
        if value != _myInt
            _myInt = value;
    }
}

所以我的问题是:检查更改的值(在后一种情况下)是否有任何好处?如果是,那么这会对自动实现的属性产生什么影响?

您不能同时执行这两项操作,请使用自动实现的属性并检查其值。只要将任何逻辑引入getter或setter,它就不再是一个自动实现的属性

auti实现属性只是访问私有支持字段的getter/setter的语法糖,就像您编写以下代码一样:

public int MyInt
{
    get { return _myInt; }
    set { _myInt = value; }
}
int newValue = -1;
if(newValue >= 0)
    myInstance.MyInt = newValue;
当您想要检查新值是否有效时,您必须使用一个具有某些逻辑的setter。例如,您可能希望检查整数是否为正值,因为您的应用程序无法处理负值。因此,您只需在setter中引入该检查

set 
{
    if (value >= 0)
        _myInt = value;
}
顺便说一句,您不能只定义一个部分(即getter或setter),您必须使用大括号来定义这两个部分。另一方面,您当然可以完全省略其中一个,使您的属性为只读或只写(尽管我几乎想不出后者的任何用途)。实际上,对于get-and-set方法,甚至属性都是语法上的糖分。所以你可以把它们看作是常用的方法。你为什么不在这里引入逻辑呢?当然,属性倾向于让人们认为他们的setter或getter中没有发生什么特别的事情,这也是惯例所建议的。然而,它们实际上没有什么特别之处,除了在自动实现属性上,您只是访问一个支持字段,而您不能在代码中访问该字段,因为IDE不知道它的名称,但它存在于IL中

编辑:返回您的问题。如果您在setter内或之前引入新值验证逻辑,则不会产生真正的区别,因此您也可以这样写:

public int MyInt
{
    get { return _myInt; }
    set { _myInt = value; }
}
int newValue = -1;
if(newValue >= 0)
    myInstance.MyInt = newValue;
但这可能会非常混乱,尤其是当您需要在代码中的其他地方设置属性并再次检查时,就会打破-原则。所以最好(在二传者内)这样做

检查更改的值(在梯形图中)是否有用

不是真的,至少在您提供的示例中不是这样。好的,除非你有在一个巨大的循环(十万)中分配给属性的代码,在这种情况下,如果检查值比分配快毫秒,那么你会看到一个明显的区别。我说了“如果”,因为我不确定
int
的情况是否如此,所以如果您对答案感兴趣,就必须测试它


然而,在其他情况下,可能会有明显的区别。例如,如果setter不仅仅是分配值。

让我们假设
MyInt
是鼠标的
X
位置,则有一个无限循环,每毫秒获取鼠标位置,并显示在窗口上。若你们不检查,你们必须每毫秒更新一次窗口,当你们的鼠标静止的时候


大多数情况下,您不需要检查,即使是相同的
,值也会更改。当您遇到性能问题时,请执行此检查。

您将在实施INotifyPropertyChanged时使用此检查。

(您只想在属性值实际更改时触发事件,而不只是在调用setter时。)

您可以执行简单的验证。在我看来,属性的setter或getter方法中不应该有任何逻辑。并建议使用自动属性。只是一个旁注,它被称为“私有字段”,而不是“私有属性”。public属性使用private字段。在实现
INotifyPropertyChanged
时,您希望执行该检查,否则,它将毫无用处。@Dennis\u有趣的是,您应该提到它。想一想,我在这个主题上读到的大部分内容都与INotifyPropertyChanged有关。你可能应该更仔细地阅读这个问题。您的回答似乎与此问题无关。@RacilHilan此问题基于一个假设,即自动实现的属性可以与验证结合使用。我澄清了这一点,并表明它们实际上只是方法。嗯,我又读了一遍这个问题,没有看到任何可能的错误假设。也许我看不到你所看到的。@RacilHilan和“如果是,那么这对自动实现的属性有什么影响”?这意味着我们可以将验证与AI属性一起使用,不是吗?不一定。但有可能。我承认那句话很模糊,也不确定OP想问什么。让我们看看OP是否会对你的答案发表评论。无论如何,你仍然没有回答主要问题,因此你的编辑很好。这是一个很好的例子,但你假设作业比检查慢。我不确定情况是否如此,至少对于简单类型来说不是这样。但是如果属性是复杂类型的,并且检查只是读取其中的一部分,那么这可能是一个很好的例子。很好的例子。您是否可以指出(为了其他人阅读本文),本例所需的验证意味着您应该使用“手动”方法?+1但您可能希望删除最后一句话。从其他答案中可以看出,它在其他情况下也很有用。虽然我已将此回答标记为已接受,但我强烈建议阅读所有答案。在这篇文章中有很多精彩之处。谢谢大家的参与。