为什么“ref”关键字与System.ServiceModel.Channels.Message一起使用?

时间:2012-04-19 15:10:14

标签: c# pass-by-reference ref

我现在正在查看一些C#代码,我想检查一下,在理解它应该如何工作时我不会疯狂。

与传递System.ServiceModel.Channels.Message有关。采用Message对象的每个方法都有一个类似于此的方法签名:

void SomeMethod(ref Message message) { ... }

我不明白为什么“ref”关键字在那里。据我所知,如果该方法不会完全取代对象,则不需要它。

void SomeMethod(ref Message message)
{
    message = new Message();
}

但是,如果消息,例如,只是在标题中添加了其他内容,或者只是从对象中读取值,则不需要“ref”关键字,因为Message是引用类型。

void SomeMethod(Message message)
{
    message.Headers.Add("Some Data");  // This should be fine?
}

干杯

1 个答案:

答案 0 :(得分:8)

首先,你可能是正确的;编写代码的人很可能错误地添加了“ref”。

我想借此机会确保您清楚地了解“ref”的含义。这意味着“为此变量创建别名”。也就是说,当你说:

M(ref string x) { x = null; }
N(string x) { x = null; }
...
string y = "abc";
N(y);
M(ref y);

N(y)的调用意味着制作y中引用的副本,并将该引用放在x 中。对M(ref y)的调用意味着 x和y现在都是同一变量的名称。也就是说,x成为y别名

我们选择“ref”作为关键字是非常不幸的,因为它会立即让人们对引用类型和值类型感到困惑。 它与引用类型和值类型没有任何关系。“ref”表示“我指的是另一个变量”。

refout之间的差异只不过是ref要求在调用之前初始化别名变量out执行此操作不。 (两者都保证在呼叫正常完成后初始化变量。)