Sal*_*leh 13 c# using-statement pass-by-reference
为什么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)
因为它是相同的表单对象.
using()语句中的var在块内被认为是只读的.见第8.13节:
在资源获取中声明的局部变量是只读的,并且必须包含初始化程序.如果嵌入语句尝试修改这些局部变量(通过赋值或++和 - 运算符)或将它们作为ref或out参数传递,则会发生编译时错误.
但请注意,这仅适用于声明为using语句一部分的变量,以下是合法的(这不是一个好主意):
var f2 = System.IO.File.OpenText("");
using (f2)
{
f2 = null;
}
Run Code Online (Sandbox Code Playgroud)