如何识别对象是刚引用还是仅复制? .net内存管理

时间:2010-06-11 13:02:20

标签: .net memory-management garbage-collection

我很困惑地发现是否要复制某个对象,或者在将对象与其他一些对象等同时保留该对象的引用。

实施例

int i =5;
int j = i;

参考或复制数据?

DataSet ds = dsOtherDataSet.Copy();

参考或复制数据?

DataView dvTemp = dsTestDataSet.Copy().DefaultView;

这里发生了什么?

此致

NLV

3 个答案:

答案 0 :(得分:2)

int i = 5;
int j = i;

作为int的数据副本是值类型并存储在堆栈中。

DataSet ds = dsOtherDataSet.Copy();

根据文档,Copy方法复制DataSet的结构和数据。因此ds将具有与原始结构相同的结构,但如果存储在两者内的参考值将指向相同的存储器位置。

DataView dvTemp = dsTestDataSet.Copy().DefaultView;

仅复制引用,因为DataView是引用类型。

答案 1 :(得分:1)

如果type为struct,则复制始终按值完成。 if class然后通过引用。

CopyClone等方法中所做的工作并没有严格定义,而是取决于实现它们的方法。

对于DataSet.Copy msdn告诉我们已完成深层复制(“复制此DataSet的结构和数据。”),这意味着它完全重新创建数据集。仍然,Copy方法返回对新数据集的引用。

答案 2 :(得分:1)

在第一种情况下,int不是对象,它们是值类型。因此,对于“int j = i”,创建另一个int,然后将i中的值复制到其中。如果您使用复制,那么它可能使用深层复制创建该对象的另一个副本。但你应该发现副本是deep-copy or just a shallow copy。如果你使用DataSet ds = dsOtherDataSet,或者对象obj = someOtherObject,那么只传递它们的地址,所以它仅供参考。