【发布时间】:2013-08-03 14:34:34
【问题描述】:
假设我有一个包含一个非常大的对象的类,可以说是一个对象列表,并通过从数据库中获取数据加载到内存中。这是针对 WPF 应用程序的。
public class MyClass {
public ReallyLargeObject largeObject;
//Other properties.
}
我有一个视图模型 (VM1) 对象,它具有将此类绑定到 XAML 的引用。
我需要另一个视图模型 (VM2),它只有 MyClass 的某些属性,而不是 largeObject。
两种情况:
-
我可以分配 VM2.myClass = VM1.myClass
var viewModel1 = new VM1() { myClass = new MyClass() { largeObject = new ReallyLargeObject(); //initialize other properties } }; var viewModel2 = new VM2() { myClass = viewModel1.myClass }; -
我可以从 VM1.myClass 创建一个 MyClass 类型的新对象,但这次设置 largeObject = null
var viewModel1 = new VM1() { myClass = new MyClass() { largeObject = new ReallyLargeObject(); //initialize other properties } }; var viewModel2 = new VM2(){ myClass = new MyClass(){ //initialize other properties } };
两个视图模型在运行时都会在内存中相当长的一段时间。
我遇到了第一种方法占用大量内存且屏幕速度相当慢的问题。
从原始对象创建一个更苗条的对象会减少使用的内存吗?
我很困惑,因为从技术上讲,视图模型 2 仅引用了视图模型 1 中的对象。
在两个包装对象中存储对同一对象的引用时,.NET 的行为如何?
它是否像其他语言一样单独存储引用并且在堆上分配给对象的内存相同?
【问题讨论】:
-
这就是整个参考点。无论哪种方式,您都不会复制
ReallyLargeObject,您只需存储对同一对象的两个引用。 -
谢谢你想确认它是一样的:)
标签: c# .net object memory reference