繁体   English   中英

不变值和自动实现的属性

[英]Non-changed value and auto-implemented properties

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

public int MyInt
{
    get; set;
}

或者,您可以使用“手动”专用字段来实现它。 在这种情况下,我经常看到人们在使用set之前先检查值的更改。 像这样:

private int _myInt;

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

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

在实现INotifyPropertyChanged时将使用该检查
(您只想在属性值实际更改时才触发事件,而不仅仅是在调用setter时才触发。)

您不能同时使用自动实现的属性和检查其值。 一旦将任何逻辑引入getter或setter中,它就不再是自动实现的属性。

auti-implementing属性只是获取/设置者访问私有后备字段的语法糖,就好像您要编写以下代码:

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

当您要检查新值是否有效时, 必须使用带有一些逻辑的设置器。 例如,您可能要检查整数是否为正,因为应用程序无法处理负值。 因此,您只需在设置器中介绍该支票即可。

set 
{
    if (value >= 0)
        _myInt = value;
}

顺便说一句,您不能只定义一个部分(即吸气剂吸气剂),而必须用花括号来定义两者。 另一方面,您当然可以完全忽略其中之一,使您的属性为只读或仅写(尽管我几乎无法想到后者的任何用法)。 实际上,即使属性是获取方法和设定方法的语法糖。 因此,您可以将它们视为常用方法。 为什么不在那里引入任何逻辑? 当然,属性倾向于使人们认为他们的二传手或getter中没有发生什么特别的事情,这也是惯例所暗示的。 但是,它们实际上没有什么特别之处,除了以下事实之外:IDE仅知道在自动实现属性上仅访问您无法在代码中访问的后备字段的名称,因为它的名称在IL内, 如此处所示

编辑:回到您的问题。 如果您要在设置器内或之前引入用于验证新值的逻辑,那将不会有什么真正的区别,因此,您也可以这样编写:

int newValue = -1;
if(newValue >= 0)
    myInstance.MyInt = newValue;

但这可能会很混乱,尤其是当您需要在代码中的其他位置设置属性并再次检查时,就会破坏DRY -priniciple。 因此,最好一次执行一次 (在设置员内部)。

检查更改的值(在梯形图情况下)是否对任何事情都有利?

并非如此,至少在您提供的示例中没有。 好吧,除非您有一个在巨大的循环(十万个循环)中分配给该属性的代码,在这种情况下,如果检查值比分配的速度快毫秒,那么您将看到明显的不同。 我说“如果”,是因为我不确定int是否适用,因此如果您对答案感兴趣,就必须对其进行测试。

但是,在其他情况下,可能会有明显的差异。 例如,如果setter不仅仅是分配值。

让我们假设MyInt是鼠标的X位置,您有一个无限循环,它每隔一毫秒就获取一次鼠标位置,并显示在窗口上。 如果不进行选择,则当鼠标静止不动时,必须每隔毫秒更新一次窗口。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM