你需要ref或out参数吗?

时间:2010-01-13 16:06:41

标签: c# oop

我将类的实例传递给方法,该方法将修改实例。

我是否需要使用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);

}

5 个答案:

答案 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。只有当引用本身被修改时,这两者才会适用。

我已经扩展了您的示例代码,以包含refout的使用情况,但两者都没有:

http://pastebin.ca/1749793

[剪断]

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)

不,不。将引用类型的实例作为参数传递时的默认行为是按值传递其引用。这意味着您可以更改当前实例,但不能将其替换为另一个不同的实例。如果这是“修改实例”的含义,那么您不需要refout

答案 4 :(得分:0)

检查智能感知的简单方法是:将鼠标悬停在ModifyXml上,如果方法签名中的参数包含out,例如ModifyXml( out Blah blah ),则需要out 1}}关键字。同样适用于ref