我现在正在查看一些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?
}
干杯
答案 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”表示“我指的是另一个变量”。
ref
和out
之间的差异只不过是ref
要求在调用之前初始化别名变量并out
执行此操作不。 (两者都保证在呼叫正常完成后初始化变量。)