3

我目前正在查看一些 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?
}

干杯

4

1 回答 1

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”的意思是“我指的是另一个变量”。

ref和之间的区别out无非是ref要求别名变量在调用之前out初始化,而不是。(两者都保证调用正常完成后变量会被初始化。)

于 2012-04-19T16:13:52.840 回答