C# 在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
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是一种结构,也称为值类型。听从约翰的建议;将结构值对象指定给变量时,将创建结构的副本,以便两个对象分开。将类引用对象指定给变量时,只复制对该对象的引用,因此只有一个对象有两个引用指向它。