首页 > 解决方案 > 为什么 `ref` 关键字在这里不是强制性的?

问题描述

我显然不明白ref,参数的范围不够好。有人能告诉我为什么这段代码有效吗?你怎么能发送dt到一个函数中(我的意思是它会变成一个参数并且作用域会是一个局部变量,对吧?)。那么为什么在被调用dt之后填充(填充) ?fill()

所以我的第一个想法是我只是发送一个对dtwith的引用fill(),但后来我不明白这个ref关键字。我认为这就是我们的目的..您只需要ref在参数是按类型的值时使用吗?

var dt = new DataTable();
using (var cmd = new MySqlCommand(cmdText, connection))
using (var adapter = new MySqlDataAdapter())
{
    adapter.SelectCommand = cmd;
    adapter.Fill(dt); // <---why is ref not needed here?
}
return dt;

标签: c#

解决方案


ref更改引用时使用的是ment ,而不是引用的实例。所以你可以不使用修改引用的实例ref,但是当你想引用另一个对象时,你必须使用ref

话虽如此,这Fill只会修改传递给它的内容,它不会创建一个新的DataTable.

另一方面,当您想返回另一个实例时,您必须使用ref

void DoSomething(ref dt)
{
    dt = new DataTable();
    // do something with the new table
}

现在你有两张表,一张是传递给DoSomething的,另一张是在该方法中创建的,与前者没有任何共同之处。但是,调用代码现在引用了该新实例,原始引用丢失了。


推荐阅读