传值和传递参数之间的差异

时间:2011-08-04 16:07:13

标签: c#

关于传值和传递参考之间差异的MS帮助页面对我来说非常清楚:

http://msdn.microsoft.com/en-us/library/8b0bdca4.aspx

然而,最后的用户评论让我感到困惑。它说(除其他外)这个:

  

如果你不使用ref或out关键字,那么方法的参数   按值传递。

评论对我来说似乎很不对劲。是吗?

(我发布了部分评论断章取义:以下是完整评论:)

  

文字说:“......但是当一个类实例被传递时,一个引用   通过。 ......“这是不正确的,你可以看到:

     

C#语言规范4.0版(微软免费下载)   5.1.4值参数声明没有ref或out的参数   修饰符是一个值参数。

     

因此,在上面的示例中,类实例按值传递,并且   不是参考。

这是完整的评论,这让我很困惑......类实例是按值而不是通过引用传递的?这是否意味着实例字节被压入堆栈?

3 个答案:

答案 0 :(得分:5)

评论是真的。如果没有refout,则变量将按值传递。但是,对于对象,您通过值传递的内容是引用。

您希望通过引用传递对象引用的唯一时间是您是否在方法中为参数指定了一个新对象,并且您希望该重新分配会影响调用者的引用副本。

你并没有真正传递对象。相反,您传递对象的引用。考虑到这一点,这个byval / byref业务适用于对象引用,而不是对象本身。

Jon Skeet对此主题有great post

答案 1 :(得分:3)

完整的评论具有误导性。对象的引用按值传递。

答案 2 :(得分:2)

评论完全正确。这里的混淆是值类型和引用类型与通过值或引用传递参数几乎无关。

将值类型作为非ref参数传递时,将传递其值。这很清楚。但是,对于引用类型,您仍然只传递一个值:您正在传递引用本身的

如果参数为ref/out,那么您实际上是说该参数是实际传递的变量的别名。在这种情况下,它是值类型还是引用类型无关紧要;正在传递对变量的引用,而不仅仅是值。