1

有人告诉我,当您将对象传递给方法时,它是“按值”传递的。我做了一个小测试来检查它:

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

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

有人可以告诉我吗?
谢谢,
插座

4

4 回答 4

3

假设Point被声明为类,而不是p自身被复制,引用p复制。所以它仍然是按值传递。您传递引用的值。

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

于 2012-06-04T12:14:45.537 回答
1

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

于 2012-06-04T12:13:55.687 回答
1

Point是结构,所以按值传递。

于 2012-06-04T12:14:00.760 回答
1

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

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

一般的不同是引用类型存在于堆上,而值类型存在于内联,也就是说,无论它是你的变量或字段被定义的地方。

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

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

这有一个好处,首先是:

  • 值类型总是包含一个值
  • 引用类型可以包含一个null引用,这意味着它们现在根本不引用任何东西

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

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

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

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

请参阅MSDN,本教程类似于您的圆/点/轴示例。

于 2012-06-04T12:18:01.123 回答