C#: Передача сложного списка объектов другому классу занимает много памяти

Этот вопрос не напрямую к мобильному приложению. Мне нужно было создать структуру, связанную с шаблоном команд, для функций отмены и повтора. У меня будет команда AddStrokeCommand, RemoveStrokeCommand и ClearAllCommand. Каждый из них может быть отменен.

Мне понадобится интерфейс, скажем ICommand с Execute и UnExecute.

Пример моего кода:

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

Само приложение показывает много страниц, которые можно аннотировать, поэтому на каждой странице может быть нарисовано много штрихов. Если я передам штрихи каждому объекту команды, будет ли он использовать много памяти? Будет ли лучший вариант?

3 ответа

Обычно экземпляры объектов передаются по ссылке, то есть они не вызывают копирование памяти, а только указатель на память.

Преимущество этого заключается в том, что оно не требует затрат памяти, а также не приводит к снижению производительности.

Недостаток (но может быть и преимуществом), если вы измените переданный элемент, изменения останутся даже после возврата к функции вызывающей стороны (поскольку существует только один экземпляр данных).

Здесь вы можете увидеть более подробную информацию: https://msdn.microsoft.com/en-us/library/4d43ts61%28v=vs.90%29.aspx

Передача CLASS не займет значительной памяти - обычно только несколько байтов, используемых для хранения адреса памяти. По сути, он передает целое число, которое является положением объекта в виртуальной памяти. (Google ищет "семантику передачи по ссылке")

СТРУКТУРА это другое дело. Структура копируется каждый раз, когда она передается в функцию или присваивается другой переменной, так что вы можете сделать здесь копии. См. "Семантика передачи по значению" для получения дополнительной информации.

Когда у вас есть следующий код:

var myObject = new SomeVeryBigAndComplexObject();

В результате вы создаете новый и очень большой объект и сохраняете его в некоторой памяти, ранее выделенной средой выполнения. Значение хранится в myObject, если SomeVeryBigAndComplexObject является ссылочным типом (class), это не сам объект, это просто адрес памяти, где находится этот объект.

Итак, когда вы делаете любое из следующего:

var obj = myObject;
Foo(myObject);

void Foo(SomeVeryAndComplexObject obj) { ... }

На самом деле вы просто копируете значение, сохраненное в ссылке myObj в obj, а не сам объект. Это очень дешево, и вам не стоит об этом беспокоиться.

Имейте в виду, что все это верно для ссылочных типов. Если объект имел тип значения (struct) тогда сам объект будет скопирован, потому что сам объект является значением переменной myObject; это одна из причин, почему структуры всегда должны быть маленькими объектами.

Другие вопросы по тегам