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,还是在方法退出时更新它?
注意:我没有写这段代码,我只是想安全地重构它.
您可以将ref视为为变量创建别名.并不是你传递的变量是"通过引用传递",而是参数和参数是同一个变量,只有两个不同的名称.所以更新一个会立即更新另一个,因为这里实际上并没有两件事情.
正如SLaks所指出的,VB中存在使用copy-in-copy-out语义的情况.如果我没记错的话,还有一些罕见且模糊的情况,其中表达式树可以编译成复制拷贝的代码,但我不记得细节.
如果此代码旨在更新变量以便在另一个线程上读取,则变量"立即"更新的事实会产生误导.请记住,在多个线程上,如果读取和写入不是易失性的,则可以观察到读取和写入相对于彼此向前和向后移动.如果打算将变量用作跨线程通信机制,则使用实际为此目的设计的对象,该对象对于该目的是安全的.使用某种等待句柄或互斥或其他什么.
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |