我将类的实例传递给方法,该方法将修改实例。
我是否需要使用out或ref关键字,因为这是我传递的类?
这就是我想要做的事情:
public void Blah()
{
Blah b = Dao.GetBlah(23);
SomeService.ModifyXml(b); // do I need to use out or ref here?
Dao.SaveXml(b.xml);
}
答案 0 :(得分:14)
考虑这个问题的正确方法是:在想要为变量创建别名时使用ref / out。也就是说,当你说:
void M(ref int x) { x = 10; }
...
int q = 123;
M(ref q);
你所说的是“x是变量q的另一个名字”。对x的内容的任何更改都会更改q,并且对q内容的任何更改都会更改x,因为x和q只是完全相同的存储位置的两个名称。
请注意,这与引用同一对象的两个变量完全不同:
object y = "hello";
object z = y;
这里我们有两个变量,每个变量都有一个名称,每个变量都指一个对象,这两个变量都引用同一个对象。在前面的示例中,我们只有一个变量,其中两个名称。
这是清楚的吗?
答案 1 :(得分:5)
如果未修改引用b
,并且仅修改了b
的属性,那么您既不需要ref
也不需要out
。只有当引用本身被修改时,这两者才会适用。
我已经扩展了您的示例代码,以包含ref
,out
的使用情况,但两者都没有:
[剪断]
public void Run()
{
Blah b = Dao.GetBlah(23);
SomeService.ModifyXml(b); // do I need to use out or ref here?
Dao.SaveXml(b.Xml);
SomeService.SubstituteNew(out b);
Dao.SaveXml(b.Xml);
SomeService.ReadThenReplace(ref b);
Dao.SaveXml(b.Xml);
}
其余代码在PasteBin中。
答案 2 :(得分:1)
不,你不想要参考或在这里。当方法将更改参数指向的对象时,您希望使用ref。当方法总是指定要指向的参数的新对象时,您想要使用。
答案 3 :(得分:1)
不,不。将引用类型的实例作为参数传递时的默认行为是按值传递其引用。这意味着您可以更改当前实例,但不能将其替换为另一个不同的实例。如果这是“修改实例”的含义,那么您不需要ref
或out
。
答案 4 :(得分:0)
检查智能感知的简单方法是:将鼠标悬停在ModifyXml
上,如果方法签名中的参数包含out
,例如ModifyXml( out Blah blah )
,则需要out
1}}关键字。同样适用于ref
。