C#构造函数,对象参数通过引用或值传递

Bob*_*bbo 10 c#

如果你有一个类和一个构造函数,它接受一个对象作为输入参数 - 该对象是通过引用传递还是通过值传递?

并且假设对于类方法,除非使用ref关键字,否则默认情况下会按值传递对象输入参数?

out关键字怎么样?这仍然意味着它是通过引用传递的吗?

jas*_*son 17

如果你有一个类和一个构造函数,它接受一个对象作为输入参数 - 该对象是通过引用传递还是通过值传递?

除非参数标有out或,否则所有参数都以C#中的值传递ref.

这是一个混乱的巨大来源.我会更明确地陈述一些事情.

除非参数标有out或,否则所有参数都会复制其值ref.对于值类型,这意味着要传递的值的副本.对于引用类型,这意味着引用的副本.对于最后一点,引用类型的值是引用.

并且假设对于类方法,除非使用ref关键字,否则默认情况下会按值传递对象输入参数?

同样,除非参数用out或标记,否则所有参数都按C#中的值传递ref.对于标记为的参数ref,对参数的引用将传递给方法,现在您可以将该参数视为别名.因此,当你说

void M(ref int m) { m = 10; }

int n = 123;
M(ref n);
Run Code Online (Sandbox Code Playgroud)

你能想到的mM为的别名n.这是mn是只是两个相同的存储位置不同的名字.

这是非常不同的

string s = "Hello, world!";
string t = s;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,st没有alises对于相同的储存位置.这是碰巧引用同一对象的两个不同变量.

那么`out关键字呢?这仍然意味着它是通过引用传递的吗?

ref和之间的唯一区别outref需要在传递之前初始化变量.

  • @Andrey:你错了,错了,错了.它是参考文献的副本,而不是参考文献的副本.这是个很大的差异.我不能强烈地说明这一点,但你的理解非常困惑. (6认同)
  • @Jason:Upvoted来抵消不应当的downvote.令人惊讶的是,有多少次问过这样的问题,有多少错误信息被发布,以及有多少好的答案被低估,而错误的答案被提出来. (2认同)
  • @Jason - 好的,现在我觉得我错了.你可以编辑你的答案,以便我可以删除我的投票吗?除非您触摸它,否则我不允许这样做. (2认同)

Ode*_*ded 13

对象的引用将按值传递.

.NET具有引用类型和值类型 - 类都是引用类型,而结构是值类型.您可以按值或按引用传递一个.

默认情况下,一切都按值传递的,不同的是引用类型的引用被通过.

refout关键字将导致参数按引用传递-价值类型,这意味着您现在可以将在传入的对象反映变化的情况下.使用引用类型意味着您现在可以更改引用引用的对象.