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
; это одна из причин, почему структуры всегда должны быть маленькими объектами.