我显然不了解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;
答案 0 :(得分:4)
ref
。因此,您可以在不使用ref
的情况下修改引用的实例,但是,当您要引用另一个对象时,则必须使用ref
说过Fill
只会修改传递给它的内容,它不会创建新的DataTable
。
另一方面,当您想返回另一个实例时,必须使用ref
:
void DoSomething(ref dt)
{
dt = new DataTable();
// do something with the new table
}
现在您有两个表,一个表传递给DoSomething
,第二个表是在该方法中创建的,并且与前一个没有任何任何内容。但是,调用代码现在引用了该新实例,原始引用丢失了。