gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:17:15 25 4
gpt4 key购买 nike

假设我有这样一个方法:

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;
}
}

它是这样使用的:

    MyCoolMethod(ref MyScannerEnabledVar);

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

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

注意:这段代码不是我写的,我只是想安全地重构它。

最佳答案

您可以将 ref 视为为变量创建别名。并不是你传递的变量是“引用传递”,而是参数和参数是同一个变量,只是两个不同的名字。因此,更新一个会立即更新另一个,因为实际上这里一开始就没有两件事。

正如 SLaks 所指出的,在 VB 中存在使用复制输入复制输出语义的情况。如果我没记错的话,还有一些罕见且晦涩的情况,在这些情况下,表达式树可能会被编译成执行复制输入复制输出的代码,但我不记得细节了。

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

关于c# - 通过引用传递的参数何时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153759/

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