为什么`ref`关键字在这里不是必需的?

时间:2019-03-25 13:37:08

标签: c#

我显然不了解ref并且参数的范围不够好。有人可以告诉我为什么此代码有效吗?您如何将dt发送到函数中(我的意思是它将成为参数,范围将作为局部变量吗?)。那么为什么在调用dt之后填充fill()

因此,我的第一个想法是,我仅使用dt发送对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;

1 个答案:

答案 0 :(得分:4)

更改引用而不是引用实例时将使用

ref。因此,您可以在不使用ref的情况下修改引用的实例,但是,当您要引用另一个对象时,则必须使用ref

说过Fill只会修改传递给它的内容,它不会创建新的DataTable

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

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

现在您有两个表,一个表传递给DoSomething,第二个表是在该方法中创建的,并且与前一个没有任何任何内容。但是,调用代码现在引用了该新实例,原始引用丢失了。