你需要ref或out参数吗?

mrb*_*lah 2 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);

}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 14

考虑这个问题的正确方法是:在想要为变量创建别名时使用ref/out.也就是说,当你说:

void M(ref int x) { x = 10; }
...
int q = 123;
M(ref q);
Run Code Online (Sandbox Code Playgroud)

你所说的是"x是变量q的另一个名字".对x 的内容的任何更改都会改变q,并且对q的内容的任何更改都会改变x,因为x和q只是完全相同存储位置的两个名称.

请注意,这与引用同一对象的两个变量完全不同:

object y = "hello";
object z = y;
Run Code Online (Sandbox Code Playgroud)

这里我们有两个变量,每个变量有一个名称,每个变量引用一个对象,两个变量都引用同一个对象.在前面的示例中,我们只有一个带有两个名称的变量.

明白了吗?


JMD*_*JMD 5

如果b没有修改引用,并且只b修改了属性,则既不需要ref也不需要out.只有在修改引用本身时,这两者才会适用.

我已经向您展示的示例代码一点,包括使用情况ref,out以及既不是:

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);
}
Run Code Online (Sandbox Code Playgroud)

其余代码在PasteBin中.