在.NET中,是通过值或引用传递的类对象

时间:2014-04-16 13:50:02

标签: .net

我们知道整数作为值类型传递,除非我们使用ref关键字。

但是类对象呢?

函数内的更新是否会导致更新对象?

弦怎么样?它是一种参考类型。在将字符串传递给函数时,行为是否相同?

3 个答案:

答案 0 :(得分:2)

对象不作为参数传递 - 引用引用按值传递,但参考引用的对象当然仍然是对象

Passing Reference-Type Parameters

  

reference type 的变量不直接包含其数据;它包含对其数据的引用。按值传递reference-type参数时,可以更改引用指向的数据,例如类成员的值。但是,您无法更改引用本身的值;也就是说,您不能使用相同的引用为新类分配内存并使其在块外保留。为此,请使用refout关键字传递参数。

我的重点


来自C# language specification, version 5,第4部分:

  

值类型与引用类型的不同之处在于值类型的变量直接包含它们的数据,而引用类型的变量将 引用 存储到它们的数据中,后者是称为 对象 。对于引用类型,两个变量可以引用同一个对象,因此对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,变量每个都有自己的数据副本,并且一个操作不可能影响另一个。

这就是为什么我画出对象根本没有传递的区别 - 因为你从来没有一个包含对象的变量

答案 1 :(得分:1)

对实例的引用按值传递。但是,由于类是引用类型,因此您对实例所做的更改也会反映在您进行这些更改的方法之外。

但是,当您覆盖方法内部的引用时,除非您指定对象引用应由ref传递,否则不会反映在方法外部。

换句话说:您不将对象作为参数传递给函数。您将对象的引用作为参数传递给函数。该引用按值传递,除非您通过ref关键字指定。

字符串是引用类型,但它们充当值类型。这意味着你无法改变'现有字符串。当您想要修改字符串时,例如通过向其添加另一个字符串:

string s = "hello";
s = s + ", world!";

事实上,你并没有改变'字符串,但实际上是创建一个新的字符串实例。在上面的例子中,s +",world!"附加2个字符串,但结果是一个新的字符串实例。 这意味着在执行第2行之后,s将指向另一个对象实例。

答案 2 :(得分:0)

默认情况下,所有参数都按C#中的值传递。如果明确包含out或ref修饰符,则参数仅通过引用传递。但是,您需要注意,当参数的类型是引用类型时,您将传递引用而不是实际对象。