在分配之前检查是否相等?

时间:2011-02-10 00:40:25

标签: language-agnostic

只有在与受让人不相同的情况下分配价值时,这是一个好的做法吗?例如,会:

bool isVisible = false;      
if(TextBox1.Visible != isVisible)
    TextBox1.Visible = isVisible;

比以下更令人满意:

bool isVisible = false;      
TextBox1.Visible = isVisible;

此外,答案是否取决于数据类型,例如具有更昂贵的Equals方法的对象与具有更昂贵的分配方法的对象?

3 个答案:

答案 0 :(得分:3)

从可读性的角度来看,我绝对更喜欢第二种方式 - 只需分配一些东西。

答案 1 :(得分:2)

某些对象属性具有语义,要求分配属性已保存的值将产生特定效果。例如,即使值未更改,设置对象的“文本”也可能会强制重绘。在处理此类对象时,除非有人想要强制执行此操作,否则应经常测试并设置是否不相等。

通常,对于字段,在集合之前进行比较没有任何优势。但是有一个值得注意的例外:如果许多并发运行的线程想要将字段设置为相同的值,并且它可能已经保持该值,那么如果所有线程无条件地写入该值,则缓存行为可能非常糟糕因为想要写入它的处理器必须从写入它的最新处理器获取高速缓存行。相比之下,如果所有处理器只是简单地读取字段并决定不管它,它们都可以共享缓存线,从而产生更好的性能。

答案 2 :(得分:1)

你的直觉似乎是正确的 - 这取决于行动的成本。

在您的示例中,使文本框可见或不可见,测试的成本是难以察觉的(只需在窗口结构中检查一下),并且分配的成本通常也是难以察觉的(重新绘制窗口)。实际上,如果将“可见”位设置为其现有值,则仍会产生函数调用成本,但窗口管理器将检查该位并立即返回。在这种情况下,请继续并指定它。

但在其他情况下,它可能很重要。例如,如果您有一个长字符串或二进制对象的缓存副本,并且每当您分配一个新值时,它都会被保存回数据库。然后你可能会发现每次测试相等的成本对于节省不必要的数据库写入是值得的。毫无疑问,你可以想象更昂贵的场景。

因此,在一般情况下,您至少需要考虑以下主要变量:测试成本,分配成本以及分配新值与分配相同值的相对频率。