【问题标题】:Why is the "ref" keyword used with System.ServiceModel.Channels.Message?为什么 System.ServiceModel.Channels.Message 使用“ref”关键字?
【发布时间】:2012-05-01 03:32:30
【问题描述】:

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

干杯

【问题讨论】:

  • 同意代码采用ref 参数的原因并不明显。也许一些额外的上下文会有所帮助。
  • 恐怕这就是我所拥有的,我查看了 MS 文档,似乎每个采用这种类型对象的方法都使用“ref”关键字?

标签: c# pass-by-reference ref


【解决方案1】:

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

【讨论】:

  • 我实际上倾向于同意“ref”的选择,因为当与引用类型(“对引用的引用”)一起使用时,这表示双重间接。相反,如果关键字是“alias”或“var”或“byname”等,那么语义相似性可能是绊脚石......
  • @Alan:我明白你的意思。但是“ref”实际上是在表达一个实现细节。从编译器开发人员的角度来看,是的,这是对存储位置的引用,其中包含对存储位置的引用这一事实很有趣,但这对用户来说并没有什么意义,毕竟他们别无他法以利用该实现细节。
  • 我看到了你的。事实是,一段时间后,人们倾向于将真正的语义(如“引用类型”)和特定的实现(如“对存储位置的引用”)混为一谈......但是是的,使用“别名”可能会减少对“普通”程序员,而编译器编写者无论如何都知道细节。
  • 所以为了确保我正确地关注你们(顺便感谢你们的回答),使用 ref 更类似于在 C/C++ 中获取指针,所以在这种情况下 SomeMethod方法看起来更像“SomeMethod(Message** message)”。我想这个问题的混淆更多是因为围绕这个区域的 MSDN 文档几乎到处都散布着“ref”关键字,我能看到这样做的唯一原因是因为 Message 类实现了 IDisposable 并且它可能试图防止物品被提前处置?
  • @daz-fuller:实际上,我没有看到 System.ServiceModel.Channels 中的“参考消息”参数激增。对于在返回 bool 的方法中创建消息的情况,有几种“输出消息”赋予的方法,这是多个返回值的经典情况;并且确实存在'ref Message',它用于有条件地将消息替换为方法内的另一个后代,这与任何明显的处置无关。
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2010-09-28
  • 2017-06-08
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多