为什么“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"。
我想借此机会确保您清楚地理解"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
不需要。 (两者都保证变量将在调用正常完成后初始化。