C#将实例变量复制到同一类函数中的局部变量

Nic*_*sen 6 c# instance-variables

我最近在一个开源项目上查看了一些代码,发现很多这种代码:

class SomeClass
{
    private int SomeNumber = 42;

    public ReturnValue UseSomeNumber(...)
    {
        int someNumberCopy = this.SomeNumber;
        if (someNumberCopy > ...)
        {
            // ... do some work with someNumberCopy
        }
        else
        {
            // ... do something else with someNumberCopy
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

制作实例变量的副本有什么好处吗?

Ale*_*x F 9

这可能是多线程程序的一部分.尽管此代码不是线程安全的,但它确保一旦分配了复制变量,它就不会被另一个线程更改,并且此后的所有函数代码都会一致地运行.

在多线程环境中,与事件类似的代码变得至关重要:

MyEvent e = this.myEvent;

if ( e != null )
{
    e();
}

在这里,不进行本地复制,如果在测试null之后,在调用之前事件变为null,则可以获得空指针异常.


kem*_*002 7

否,除非您不想更改SomeNumber的值,并且您打算更新someNumberCopy.就像你要循环次数并且将someNumberCopy减少到零以跟踪计数一样.

我想复制这样的变量可以保护你免受某些外部功能的影响,改变SomeNumber并在执行操作时不知情地更改它.如果该类应该在多线程应用程序中使用,我可能会看到这个.也许不是我会这样做,但这可能是作者的意图.