C#传递参数(值或参考)?

时间:2012-06-04 12:11:25

标签: c# oop methods pass-by-reference pass-by-value

我被告知当你将一个Object传递给一个方法时, 它是通过“价值”传递的。我做了一点测试来检查它:

Point p = new Point(1, 1);
Circle c = new Circle(p);
p.x = 999;
Console.WriteLine(c.p.x);

上面的代码打印“999”,但我认为该对象被复制到方法
我被告知,如果你没有使用“ref”(或“out”),那么方法得到的值为
对象。

有人能说清楚吗? 谢谢,
socksocket

4 个答案:

答案 0 :(得分:3)

假设Point被声明为类,而不是p本身被复制,则复制引用p。所以它仍然是通过价值。您传递了引用的值。

当说Point p = new Point(1, 1);(并且如果point是引用类型)时,可能会认为它是包含Point的变量,但实际上它是一个包含对{{1}的引用的变量存储在其他地方。

答案 1 :(得分:1)

C#是按值传递 - 参考值是在正常情况下传递的,即。 (这意味着它是对同一对象的新引用)

答案 2 :(得分:1)

Point是结构,因此通过值传递。

答案 3 :(得分:1)

在.NET中,有两类类型,引用类型值类型

结构是值类型,类是引用类型

一般的不同是引用类型存在于堆上,而值类型生活在内联中,也就是说,只要定义了变量或字段。

包含值类型的变量包含整个值类型值。对于结构,这意味着变量包含整个结构及其所有字段。

包含引用类型的变量包含指针或引用到内存中实际值所在的其他位置。

这有一个好处,首先是:

  • 值类型始终包含值
  • 引用类型可以包含 null - 引用,这意味着它们目前根本不引用任何内容

在内部,引用类型被实现为指针,并且知道并且知道变量赋值如何工作,还有其他行为模式:

  • 值类型变量的内容复制到另一个变量中,将整个内容复制到新变量中,使两者不同。换句话说,在复制之后,对一个的更改不会影响另一个
  • 引用类型变量的内容复制到另一个变量中,复制引用,这意味着您现在有两个对同一其他地方存储实际数据的引用。换句话说,在复制之后,更改一个引用中的数据也会影响另一个引用,但这只是因为你真的只是在同一个数据中查看两个地方

声明变量或字段时,这两种类型的区别如下:

  • 变量:值类型存在于堆栈中,引用类型作为指向堆内存中实际内存所在位置的指针存在于堆栈中
  • class / struct-field:值类型存在于类中,引用类型作为指向实际内存所在的堆内存中某处的指针存在于类中。

请参阅MSDN,此tutorial与您的Circle / Point / Axises示例类似。