gpt4 book ai didi

c# - .NET Framework 在更改特定属性之前是否执行内部检查?

转载 作者:行者123 更新时间:2023-11-30 14:33:15 26 4
gpt4 key购买 nike

在很多情况下,我碰巧遇到这样一种情况,我想知道我是否必须在设置变量之前执行 IF 检查(并增加方法的复杂性),或者这是否由 Windows 或框架在内部完成。

例如,假设我们有一个不断被触发的事件,例如表单的 MouseMove 事件。这些方法中的哪一种更好用?调用 this.Cursor = Cursors.SizeNWSE; 是否也在内部检查以确保在不需要时不会执行任何操作,或者它是否盲目执行代码?

示例 A:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.X - this.Width > -16 && e.Y - this.Height > -16)
{
this.Cursor = Cursors.SizeNWSE;
}
else
{
this.Cursor = Cursors.Arrow;
}
}

示例 B:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.X - this.Width > -16 && e.Y - this.Height > -16)
{
if (this.Cursor != Cursors.SizeNWSE)
this.Cursor = Cursors.SizeNWSE;
}
else
{
if (this.Cursor != Cursors.Arrow)
this.Cursor = Cursors.Arrow;
}
}

最佳答案

简而言之:是的,进行检查效率最高。

深度:

我已经测试和比较(代码在 Form 的 Load 事件上运行),并且惊讶地发现实际差异。

这是我用来测试的代码:

this.Cursor = Cursors.SizeNWSE;

var sw1 = Stopwatch.StartNew();
for (var i = 0; i < 10000000; i++)
{
this.Cursor = Cursors.SizeNWSE;
}
sw1.Stop();

var sw2 = Stopwatch.StartNew();
for (var i = 0; i < 10000000; i++)
{
if (this.Cursor != Cursors.SizeNWSE)
{
this.Cursor = Cursors.SizeNWSE;
}
}
sw2.Stop();

然后我在两者之间交换,在第一个案例之前运行第二个案例,只是为了确定。结果是肯定的!

With If: 00:00:00.8065328

Without If: 00:00:20.8631726

差别很大!没有检查的运行比有检查的运行慢 20 多倍。

这意味着在分配 Cursor 时,不会检查确定是否可以忽略分配。

但是如果赋值真的不能被忽略会怎样呢?如果每次都是不同的 Cursor 怎么办?

好问题!答案是进一步的测试表明,当分配的游标与分配时的实际游标完全不同时,yes-check 和 no-check 版本之间的差异很小,因此分配从来都不是多余的。区别显然在于执行检查所花费的额外时间。

ReSharper 可能会警告您检查是多余的(“赋值前的冗余检查”),但在本例中并非如此!当然不是。

如果你经常这样做,你想检查一下。

在 MouseMove 事件中,我建议进行检查,以防止鼠标滞后。即使您没有注意到它,它也可能会在速度较慢的机器上显示。

关于c# - .NET Framework 在更改特定属性之前是否执行内部检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com