2016-11-23 126 views
0

c#在这里框一个结构?通过引用传递结构时C#框或复制?

struct S { int x; } 

void foo(ref S s) { s.x = 1; } 

main { 
    var s = new S(); 
    foo(ref s); <-- boxing?? 
} 

我听说过有关结构类的奇怪的东西。这里有拳击吗?这是传递成员的副本吗?

class C { S s; } 

main { 
    var c = new C(); 
    foo(ref c.s); <-- boxing here?? copy here??? 
} 
void foo(ref S s) { s.x = 1; } 
+1

如果产生副本,'ref'会有什么意义?这是没有'ref'的情况。所以'ref',为了不完全多余,必须有所不同,因为......不作复制。 – stakx

+0

我是一名C++开发人员。当我看看C#做什么时,一切似乎都是多余的! :)我想知道在使用它之前,什么东西会花费我。那么为什么不会在值类型框中引用值类型,以便它可以像引用类型那样传递它。请问。 – johnnycrash

+2

任何一个代码片段都没有复制或装箱。 –

回答

4

所以Struct是值类型,如果你读裁判

的文件不要混淆引用传递与 引用类型概念的概念。这两个概念是不一样的。方法参数 可以通过ref进行修改,无论它是否为值类型或参考类型为 。 当通过引用传递 时,没有值类型的装箱。

ref (C# Reference)

这里解释究竟裁判做。

ref关键字导致参数传递参数,而不是 值。通过引用传递的效果是,对调用方法中参数 的任何更改都会反映在调用方法中。

+0

当结构是类的成员时,情况如何? – johnnycrash

+0

@johnnycrash Struct仍然是值类型,所以没有区别。 – mybirthname