Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改对象的属性会影响更改B对象的属性_C#_Object_Memory Management - Fatal编程技术网

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
是引用类型(用class
SomeClass{…}
声明)。
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
作为参数调用方法也会重复)。因此,不要创建大的结构。请参阅。好的。谢谢您的建议。:-)