c#:将复杂的对象列表传递给另一个类会占用大量内存吗?
本文关键字:内存 另一个 复杂 对象 列表 | 更新日期: 2023-09-27 18:05:20
这个问题不能直接给手机应用。我需要为撤消和重做功能创建一个命令模式相关的结构。命令我将有AddStrokeCommand, RemoveStrokeCommand和ClearAllCommand。每一个都可以撤销。
我将需要一个接口说iccommand与执行和取消执行。
我的代码示例:
public class AddStrokeCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public ObservableCollection <Stroke> Strokes { get; set;}
public AddStrokeCommand (ObservableCollection<Stroke> strokes) {
Strokes = strokes;
}
public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}
public void Execute(object parameter)
{
Strokes.Add( (Stroke) parameter);
}
public void UnExecute()
{
Strokes.Remove( (Stroke) parameter);
}
}
应用程序本身显示了许多可以注释的页面,因此可能在每个页面上绘制了许多笔画。如果我将笔画传递给每个命令对象,它会使用大量内存吗?会有更好的选择吗?
通常,对象的实例是通过引用传递的,这意味着它们不会导致内存被复制,只传递一个指向内存的指针。
这样做的好处是它不会消耗内存,也不会影响高性能。
缺点(但也可能是优点)是,如果您更改了传递的项,即使在返回到调用函数之后,更改将保留(因为只有一个数据实例)。
在这里你可以看到更多的细节:https://msdn.microsoft.com/en-us/library/4d43ts61%28v=vs.90%29.aspx
传递class不会占用任何重要的内存——通常只占用用于保存内存地址的几个字节。它实际上传递一个整数,表示对象在虚拟内存中的位置。(谷歌搜索"引用传递语义")
STRUCT是另一回事。每次将结构体传递给函数或赋值给另一个变量时,它都会被复制,因此您可能会发现自己在这里进行复制。
当您有以下代码时:
var myObject = new SomeVeryBigAndComplexObject();
所发生的是,你创建了一个新的非常大的对象,并将其存储在运行时先前分配的一些内存中。如果SomeVeryBigAndComplexObject
是引用类型 (a class
),则存储在myObject
中的值不是对象本身,它只是该对象所在的内存地址。
所以,当你做以下任何一件事时:
var obj = myObject;
Foo(myObject);
void Foo(SomeVeryAndComplexObject obj) { ... }
您真正做的是简单地复制值存储在引用myObj
到obj
,而不是对象本身。这个非常便宜,你完全不用担心。
请记住,所有这些都适用于引用类型。如果对象是值类型 (struct
),则对象本身将被复制,因为对象本身是变量myObject
的值;这就是为什么结构总是小对象的原因之一。