2

当我有这个代码时:

class A 
{
    public int X = 0;
 ...
}

public void Function()
{
    // here I create a new instance of class
    A a = new A();
    a.X = 10;
    // here I create a pointer to null
    A b = null;
    // here I assign a to b
    b = a;
    b.X = 20;
}

我现在是否传递了对 A 类实例的引用?或者我将 A 的实例克隆到新实例并在 b 中创建了对它的引用?

改变 b 中的 X 是否也改变 a 中的 X?为什么?如果不是,那么创建 a 的副本并将其插入 b 的正确方法是什么?

为什么相同的字符串总是会创建一个副本?字符串中的相等运算符是否被覆盖?

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );
4

4 回答 4

6

C# 使用引用而不是指针。类是reference types.

在您的示例中, b与 具有相同的引用a。它们引用内存中的相同位置。

改变 b 中的 X 也改变 a 中的 X?为什么?

是的,因为它们引用相同的对象并且更改一个引用会影响另一个引用。

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );

字符串也是引用类型。但他们也是immutable type。这意味着您无法更改它们。即使你认为你改变了它们,你实际上也创建了新的字符串对象。

  1. 您创建一个对象的行包含"hello"一个名为a.
  2. 行创建一个新的引用,称为b引用同一个对象。( "hello")
  3. 线你分配你的b参考新对象称为"world". 您的 b 引用"hello"不再引用对象。
于 2013-02-13T10:16:17.407 回答
4

我现在是否将指针传递给 A 类的实例?或者我将A的实例克隆到新实例并在b中创建了一个指向它的指针?

b持有与 相同的引用a,它们都指向相同的位置。

改变 b 中的 X 也改变 a 中的 X?为什么?

因为它们都指向同一个引用。

创建a的副本并将其插入b的正确方法是什么?

实现IClonable 接口

支持克隆,它创建一个与现有实例具有相同值的类的新实例

编辑

由于您使用字符串编辑了问题,虽然字符串是引用类型,但它们也是不可变

字符串(C# 参考)

字符串是不可变的——字符串对象的内容在创建对象后不能更改,尽管语法使它看起来好像您可以这样做。

于 2013-02-13T10:11:12.837 回答
1

分配时,您传递分配的表达式的返回值的副本。

  • 对于值类型,这是您在使用它们时通常会看到的值(如整数的数值)。
  • 对于引用类型,实际值类似于指向被引用对象的地址(但实际上是实现细节)。因此,即使您传递了该地址的副本,该副本也指向同一个对象。
于 2013-02-13T10:47:49.373 回答
1

对象 b 指向对象 a,您必须进行深度克隆才能使用IClonable 接口进行复制。

于 2013-02-13T10:13:15.177 回答