是传递引用或对象副本的等号

本文关键字:副本 对象 引用 | 更新日期: 2023-09-27 17:58:52

当我有这个代码时:

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 );

是传递引用或对象副本的等号

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

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

改变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"对象

我现在把指针传给A类的实例了吗?或者我克隆了A的实例指向新实例,并在b?

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

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

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

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

实现IC可克隆接口

支持克隆,它使用与现有实例的值相同

编辑

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

字符串(C#参考)

字符串是不可变的——字符串对象的内容不能是在创建对象后更改,尽管语法使其看起来好像你能做到这一点。

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

赋值时,传递赋值表达式的返回值的副本。

  • 对于值类型,这是您在使用它们时通常可以看到的值(如整数的数值)
  • 对于引用类型,实际值类似于指向被引用对象的地址(但是,真正的是实现细节)。因此,即使您传递了该地址的副本,该副本也指向同一个对象