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); 
        }
    }

应用程序本身显示了许多可以注释的页面,因此可能在每个页面上绘制了许多笔画。如果我将笔画传递给每个命令对象,它会使用大量内存吗?会有更好的选择吗?

c#:将复杂的对象列表传递给另一个类会占用大量内存吗?

通常,对象的实例是通过引用传递的,这意味着它们不会导致内存被复制,只传递一个指向内存的指针。

这样做的好处是它不会消耗内存,也不会影响高性能。

缺点(但也可能是优点)是,如果您更改了传递的项,即使在返回到调用函数之后,更改将保留(因为只有一个数据实例)。

在这里你可以看到更多的细节: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) { ... }

您真正做的是简单地复制存储在引用myObjobj,而不是对象本身。这个非常便宜,你完全不用担心。

请记住,所有这些都适用于引用类型。如果对象是值类型 (struct),则对象本身将被复制,因为对象本身是变量myObject的值;这就是为什么结构总是小对象的原因之一。