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

本文关键字:Message Channels 一起 ServiceModel System ref 关键字 为什么 | 更新日期: 2023-09-27 18:31:51

我现在正在查看一些 C# 代码,我想检查一下我是否对它应该如何工作的理解发疯。

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

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

我不明白的是为什么"ref"关键字在那里。 据我所知,如果该方法不能完全替换对象,则不需要它。

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

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

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

干杯

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

首先,你可能是对的;编写代码的人很可能错误地添加了"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不需要。 (两者都保证变量将在调用正常完成后初始化。