为什么c#不允许将using变量作为ref或out传递给函数

Sal*_*leh 13 c# using-statement pass-by-reference

可能重复:
通过引用传递IDisposable对象会导致错误?

为什么C#不允许将变量从using块传递给函数作为ref或out?

这是我的代码:

using (Form s = new Form())
{
    doSomthing(ref s);
}
Run Code Online (Sandbox Code Playgroud)

函数在使用块结束之前结束,为什么C#不允许我s作为ref或out参数传递?

Mar*_*ell 24

using变量被视为只读,因为任何重新分配都可能是错误.由于ref允许重新分配,这也是一个问题.在IL级别,out与...非常相似ref.

但是,我怀疑你需要 ref在这里; 你已经传递了表单的引用,因为它是一个类.对于参考类型,a的主要目的ref是允许您重新分配变量,并让调用者看到重新分配,即

void doSomething(ref Form form)
{
    form = null; // the caller will see this change
}
Run Code Online (Sandbox Code Playgroud)

不是,如果你只是谈话的形式对象所需:

void doSomething(Form form)
{
    form.Text = "abc"; // the caller will see this change even without ref
}
Run Code Online (Sandbox Code Playgroud)

因为它是相同的表单对象.

  • @LightWing以避免混淆:即如果更改变量的值会发生什么?什么被处置?*原始*值?还是*最终*值?IMO只有***原始的***值才有意义(事实上你甚至不需要捕获它) - 那你为什么需要重新分配呢?什么*可能*场景使得在using语句中重新分配l值很有用?如果您发现这种情况,请改用try/finally. (2认同)

Hen*_*man 9

using()语句中的var在块内被认为是只读的.见第8.13节:

在资源获取中声明的局部变量是只读的,并且必须包含初始化程序.如果嵌入语句尝试修改这些局部变量(通过赋值或++和 - 运算符)或将它们作为ref或out参数传递,则会发生编译时错误.

但请注意,这仅适用于声明为using语句一部分的变量,以下是合法的(这不是一个好主意):

var f2 = System.IO.File.OpenText("");
using (f2)
{
    f2 = null;
}
Run Code Online (Sandbox Code Playgroud)