通过引用传递的参数何时更新?

Vac*_*ano 4 c# reference parameter-passing

假设我有这样的方法:

public void MyCoolMethod(ref bool scannerEnabled)
{
    try
    {
        CallDangerousMethod();


    } 
    catch (FormatException exp)
    {
        try
        {
            //Disable scanner before validation.
            scannerEnabled = false;

            if (exp.Message == "FormatException")
            {
                MessageBox.Show(exp.Message);
            }
        }
        finally
        {
            //Enable scanner after validation.
            scannerEnabled = true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它使用如下:

    MyCoolMethod(ref MyScannerEnabledVar);
Run Code Online (Sandbox Code Playgroud)

扫描仪可以随时在单独的线程上触发.我们的想法是,如果我们处理异常,就不要让它.

我的问题是,当设置scannerEnabled时,对MyCoolMethod的调用是否会更新MyScannerEnabledVar,还是在方法退出时更新它?

注意:我没有写这段代码,我只是想安全地重构它.

Eri*_*ert 5

您可以将ref视为为变量创建别名.并不是你传递的变量是"通过引用传递",而是参数和参数是同一个变量,只有两个不同的名称.所以更新一个会立即更新另一个,因为这里实际上并没有两件事情.

正如SLaks所指出的,VB中存在使用copy-in-copy-out语义的情况.如果我没记错的话,还有一些罕见且模糊的情况,其中表达式树可以编译成复制拷贝的代码,但我不记得细节.

如果此代码旨在更新变量以便在另一个线程上读取,则变量"立即"更新的事实会产生误导.请记住,在多个线程上,如果读取和写入不是易失性的,则可以观察到读取和写入相对于彼此向前和向后移动.如果打算将变量用作跨线程通信机制,则使用实际为此目的设计的对象,该对象对于该目的是安全的.使用某种等待句柄或互斥或其他什么.