【问题标题】:in C#, new class object changes original object value, but struct not [duplicate]在 C# 中,新类对象更改原始对象值,但结构不 [重复]
【发布时间】:2021-04-04 13:17:02
【问题描述】:

在使用 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

我的问题是为什么 Class 对象的行为与此处的结构不同 如您所见,我是否将其影响的后一个对象更改为从中复制的对象

【问题讨论】:

  • 查找值类型与引用类型。
  • 提示:intstruct(也称为“值类型”)。 (see documentation)。并听从约翰的建议;)
  • 当你将一个结构(值)对象赋值给一个变量时,会生成一个结构的副本,以便两个对象是分开的。当你将一个类(引用)对象赋值给一个变量时,只是复制了对该对象的引用,所以只有一个对象有两个引用指向它。

标签: c#


【解决方案1】:

为此,您需要了解 struct 是值类型,而 class 是引用类型,这意味着在 struct 中,数据是按值复制的,这意味着每次创建新的数据副本时,如果是引用类型,我们只需有一个新的引用副本指向相同的数据。

当这行执行时:

c222 = c111;

c222c111 都指向相同的数据或内存位置。现在当以下行执行时:

c222.v = 9;

c222c111 都能够看到更改的数据,因为它们都指向相同的数据或内存位置。

当此行执行时:

BBB = AAA;

AAA 中存在数据的新副本,但更改 BBB 不会影响 AAA,因为 BBB 是按来自 AAA 的值而不是引用复制的。

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

Value Types and Reference Types Microsoft Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 2022-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多