C#传递值/参考?

时间:2009-01-12 20:59:39

标签: c#

常见问题,但我可以使用“英语”解释..

我喜欢Java

Cat myCat

实际上是指向Cat的指针?

我真的应该在c#中创建复制构造函数吗?


我知道我们正在通过值传递,但现在我的问题是我们是通过指针值还是对象的完整副本传递?

如果是后者,是不是太昂贵的性能/记忆明智?那是你必须使用ref关键字吗?

4 个答案:

答案 0 :(得分:48)

正如@rstevens回答的那样,如果它是一个类,myCat就是一个引用。但是如果你将myCat传递给方法调用,那么引用本身就会通过值传递 - 即参数本身将引用同一个对象,但它是一个全新的引用,所以如果你将它赋值为null,或者创建一个新对象,旧的myCat参考仍将指向原始对象。

SomeMethod(myCat);

void SomeMethod(Cat cat)
{
    cat.Miau(); //will make the original myCat object to miau
    cat = null; //only cat is set to null, myCat still points to the original object
}

Jon Skeet对此有一个很好的article

答案 1 :(得分:12)

请记住,指针与引用不完全相同,但如果需要,您可以这样想。

我发誓我在10分钟前看到了另一个问题,但我现在找不到链接了。在我看到的另一个问题中,他们谈论的是通过ref和值传递参数,并且归结为:

  

默认情况下,在.Net中,您不会通过引用传递对象。您可以按值传递对象的引用。

差异很微妙但很重要,特别是例如,如果要分配给方法中传递的对象。

答案 2 :(得分:3)

如果你将Cat视为

class Cat {...}

然后就是。

如果你将猫视为

struct Cat {...}

那么你的变量“就是”结构本身。

这是.Net中引用类型和值类型之间的区别。

答案 3 :(得分:0)

是的,这是关于指针但不是真的......最让我搞砸的事情是,它并不是关于保护你的变量不受方法内变化的影响。如果更改方法中的对象,则无论是否以“ref”传递,外部方法都可以看到这些更改。

差异(据我所知)是,如果您更改变量引用的对象,您发送的变量是否更新了其引用。所以给出了这个方法

public void DoSomething(ref CoolShades glasses)
{
    glasses.Vendor = "Ray Ban";
    glasses = new CoolShades();
}

作为参数传入的变量现在包含对新CoolShades的引用,而不是之前引用的任何对象。无论您是否传递了参数ref,原始参数对象的Vendor属性都将更改为“Ray Ban”。

相关问题