C# 等号传递的是引用还是对象副本?

C# 等号传递的是引用还是对象副本?,c#,string,object,reference,C#,String,Object,Reference,当我有此代码时: 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;

当我有此代码时:

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的正确方法是什么

为什么相同的字符串总是创建一个副本?是否在字符串中重写equal运算符

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );
我现在是否传递了指向类A实例的指针?或者我克隆了 是否将A的实例添加到新实例,并在b中创建指向该实例的指针

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

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

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

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

实施

支持克隆,这将创建具有 与现有实例的值相同

编辑

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

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


对象b指向对象a,您必须使用
IClonable
接口进行深度克隆以创建副本。

C#使用引用而不是指针。课程是

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

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

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

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );
字符串也是引用类型。但他们也是。这意味着你不能改变它们。即使您认为您更改了它们,您实际上也创建了新的字符串对象

  • 创建对象的行包含一个名为
    a
    的引用的
    “hello”
  • 创建一个名为
    b
    的新引用以引用同一对象。(
    “你好”
  • 指定
    b
    引用名为
    “世界”
    的新对象的行。您的b引用不再引用
    “hello”
    对象

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

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

    这些不是指针。C#使用引用。说C#不使用指针,然后又说它们“指向”同一内存位置,这有点令人困惑!!对于其他人:C#不使用“指针”,而是使用“引用”。但“引用”在概念上是“类型安全指针”。引用和指针都指向内存中的某个位置,但引用澄清了该位置的数据类型<代码>指针说:这是一个位置。
    参考说明:这是字符串的位置。