gpt4 book ai didi

c# - 为什么 "ref"关键字与 System.ServiceModel.Channels.Message 一起使用?

转载 作者:行者123 更新时间:2023-11-30 14:00:39 25 4
gpt4 key购买 nike

我目前正在查看一些 C# 代码,我想检查一下我对它应该如何工作的理解是否有问题。

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

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

我不明白的是为什么“ref”关键字在那里。就我的理解而言,如果该方法不会完全替换对象,则不需要它。

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

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

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

refout的区别无非就是ref要求别名变量在之前初始化call 和 out 没有。 (两者都保证变量将在调用正常完成后 初始化。)

关于c# - 为什么 "ref"关键字与 System.ServiceModel.Channels.Message 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10231126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com