C# · 12月 27, 2021

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

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

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

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

解决方法

If you have class and a constructor which takes in an object as a input param – is that object passed by reference or is it passed by value?

所有参数都通过C#中的值传递,除非参数被标记为out或ref.

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

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

And is it true to assume that for class methods,object input parameters are passed by value by default unless the ref keyword is used?

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

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

你可以认为M中的m是n的别名.那是m和n只是同一个存储位置的两个不同的名字.

这是非常不同的

string s = “Hello,world!”;string t = s;

在这种情况下,对于相同的存储位置,s和t不是通道.这些是两个不同的变量,即引用同一个对象.

What about the `out keyword? Does this still mean that it is passed by reference?

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