C# 在C中,新的类对象更改原始对象值,但结构不更改

C# 在C中,新的类对象更改原始对象值,但结构不更改,c#,C#,在使用c时,有些地方我不太清楚,希望我能在这里得到一些答案 using System; public struct SampleStruct { public float v; } public class SampleClass { public float v; } public class Program { private float aaa; private float bbb; private SampleClass c111 = new S

在使用c时,有些地方我不太清楚,希望我能在这里得到一些答案

using System;

public struct SampleStruct {
    public float v;
}
public class SampleClass {
    public float v;
}
public class Program
{
    private float aaa;
    private float bbb;
    private SampleClass c111 = new SampleClass();
    private SampleClass c222 = new SampleClass();
    private SampleStruct AAA = new SampleStruct();
    private SampleStruct BBB = new SampleStruct();

    public void Main()
    {

      //test int field
      aaa = 10;
      bbb = aaa;
      bbb = 9;
      Console.WriteLine("int test: " + aaa);

      //test class
      c111 = new SampleClass { v = 10 };
      c222 = c111;
      c222.v = 9;
      Console.WriteLine("class test: " + c111.v);

      //test struct
      AAA = new SampleStruct { v = 10 };
      BBB = AAA;
      BBB.v = 9;
      Console.WriteLine("class struct: " + AAA.v);
    }
}


//output
//int test: 10
//class test: 9
//class struct: 10
我的问题是为什么类对象的行为与结构不同
正如您所见,如果我将后一个对象更改为它从中复制的对象,您需要理解struct是一个值类型,而class是一个引用类型,这意味着在struct中,数据是按值复制的,这意味着每次创建数据的新副本,而对于引用类型,我们只有一个新的副本指向相同数据的引用副本

执行此行时:

c222 = c111;
BBB = AAA;
c222和c111都指向相同的数据或内存位置。现在,当执行以下行时:

c222.v = 9;
c222和c111都能够看到更改的数据,因为它们都指向相同的数据或内存位置

当此行执行时:

c222 = c111;
BBB = AAA;
AAA中存在数据的新副本,但更改BBB不会影响AAA,因为BBB是通过AAA not reference中的值复制的

您应该通过以下步骤来进一步了解这一点:


查找值类型与引用类型。提示:int是一种结构,也称为值类型。听从约翰的建议;将结构值对象指定给变量时,将创建结构的副本,以便两个对象分开。将类引用对象指定给变量时,只复制对该对象的引用,因此只有一个对象有两个引用指向它。