C# 更改对象的属性会影响更改B对象的属性
我有一行代码:C# 更改对象的属性会影响更改B对象的属性,c#,object,memory-management,C#,Object,Memory Management,我有一行代码: SomeClass a = new SomeClass(); SomeClass b = a; a.price = 15; b.price = 20; Console.WriteLine(a.price); // output 20 首先创建对象a,然后创建对象b。我给对象b分配了对象a。当我初始化这些对象的属性价格时,你们可以看到对象a的价格是15,对象b的价格是20。但当您将20分配给对象b的价格时,同时,对象a的价格也会受到影响为什么? 我的意思是内存中发生了什么导致这
SomeClass a = new SomeClass();
SomeClass b = a;
a.price = 15;
b.price = 20;
Console.WriteLine(a.price); // output 20
首先创建对象a,然后创建对象b。我给对象b分配了对象a。当我初始化这些对象的属性价格时,你们可以看到对象a的价格是15,对象b的价格是20。但当您将20分配给对象b的价格时,同时,对象a的价格也会受到影响为什么?
我的意思是内存中发生了什么导致这种情况?
SomeClass
是引用类型(用classSomeClass{…}
声明)。
a
和b
引用类的同一实例(您使用new SomeClass()
创建的实例)。这意味着,它指向同一实例(然后指向同一内存项)
要获得所需的行为,必须使用值类型(用struct
SomeStruct{…}
声明)。这是ValueType
和ReferenceType
之间的基本区别
ValueType在内存中分配一个空间来存储值。(例如:int、bool、char是值类型)
使用ReferenceType在内存中创建一个对象,然后通过一个单独的引用(而不是指针)进行处理。此引用负责更改前一个对象的值。
对象b是对对象a的引用,如果您知道指针,那么它就是一个指针,因此如果a或b更改,则另一个会反映change@MEYWD:
b
根本不是一个对象。它是一个变量。b
的值与a
的值相同-两者都是对同一对象的引用。区分变量、引用和对象的概念。更改a
的值(以引用其他对象)不会对b
的值做任何更改。这只是对它们都引用的对象的一个更改,反映出来。@JonSkeet你是对的,我只是想用一个简单的形式来解释它,而对象是变量。@MEYWD:问题是,使事情“简单”往往会混淆事情:(是的,当我用struct更改类时,这种情况不会发生。谢谢。但是,要小心struct。因为执行b=a
会将a
的内存复制到b
(即使使用a
作为参数调用方法也会重复)。因此,不要创建大的结构。请参阅。好的。谢谢您的建议。:-)