为什么我的对象是指针

本文关键字:指针 对象 我的 为什么 | 更新日期: 2023-09-27 18:02:19

我的问题是关于c#中对象的使用。我想我明白发生了什么,但我想知道原因。由于某些原因,我不想详细说明,我想用对象的当前数据(当前状态)创建一个对象的临时副本。我想我可以创建一个新对象,给它赋值原始对象,然后改变原始对象。在这一点上,有两个物体处于不同的状态。但实际情况是,复制的对象最终看起来与第一个对象完全相同。下面是一些代码来说明:

Order o1 = new Order();
o1.property1 = "test 1";
Order o2 = new Order();
o2 = o1;
o1.property1 = "test 2";

但是在这段代码的末尾,o1和o2都将property1设置为"test 2"。我想我意识到所有的对象都是指针,所以如果你改变一个,它会改变另一个,但我不明白为什么会这样,或者为什么它有用。我是不是漏掉了什么基本的东西?还有,完成我想做的事情的最好方法是什么?即:存储对象的状态,进行更改,然后在必要时进行恢复。

为什么我的对象是指针

c#中的对象变量是指向内存中特定对象的引用(不是指针)。当你声明

Order o2 = new Order();

您正在堆中创建一个新的Order对象,并将对该对象的引用分配给o2变量。当你输入

o2 = o1;

告诉编译器使o2成为o1的引用。此时,对原始o2对象的引用将丢失,并且该对象的内存将在下一次垃圾收集扫描期间被删除。

从此以后,o1和o2都在内存中引用同一个对象。要将信息从一个对象复制到另一个对象,您需要实现一个过程来实例化一个新的目标对象,并将所有数据从一个对象复制到另一个对象。有关更多信息,请参阅iclonable的MSDN文档

你所指的是值类型和引用类型之间的区别。显然你的Order对象是一个引用类型,我认为它是一个类。

类是引用类型,意味着它们是"指针"。这样做的原因之一是性能,因为您不希望每次分配变量时都复制大量数据。

结构体是值类型,在赋值时将被复制到内存中。

你有两个解决方案:

  • 使用struct代替class
  • 使用MemberwiseClone克隆你的对象,如果它是非常简单的,或者使用你自己的方法,如果你需要执行一个深度克隆。

这是设计。如果你想克隆并保持克隆的独立性,我建议在你的类型上实现一个"克隆"机制。这可以是ICloneable,甚至只是一个构造函数,它接受一个实例并从中复制值。

关于你的问题
完成我想做的事情的最好方法是什么?这是:存储对象的状态,进行更改,然后在必要时恢复
一个简单的方法是简单地序列化对象,例如使用XMLSerializer。然后,如果您想放弃您的更改,只需反序列化原始对象并将修改后的对象替换为原始版本。

使用结构体来完成任务,类是引用类型,结构体是值类型。类存储在内存堆上结构体存储在堆栈中。欲了解更多信息,搜索Structs与Classes并了解差异

根据定义,对象是一个"指针";它们保存对数据的引用,而不是实际的数据本身。你可以给它指定一个值类型,这样它就会呈现出保存数据的样子。

如上所述,理解值类型和引用类型是关键。

Java除了对象引用之外没有任何非基本数据类型的概念;因为几乎任何可以对对象引用做的事情都涉及到对由此引用的对象的操作,Java中的.操作符。尽管。net确实有非原语值类型,但大多数。net语言保持惯例(与C和c++不同,它们使用->访问指向对象的成员,使用.访问结构体的成员),即对"解引用和访问成员"answers"访问值类型成员"使用相同的.操作符。

就我个人而言,我不喜欢Java的"一切都是对象引用"的设计,并且。net决定让值类型和引用类型使用相同的.运算符来表示非常不同的东西,这没有帮助,但它就是这样。