2016-09-01 5 views
2

Этот вопрос не касается мобильного приложения. Мне нужно было создать структуру, связанную с Command Pattern, для функций Undo и Redo. У меня будет команда AddStrokeCommand, RemoveStrokeCommand и ClearAllCommand. Каждый из них можно отменить.C#: Передает ли сложный список объектов другому классу много памяти

Мне нужен интерфейс, который говорит 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); 
     } 
    } 

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

+1

Вы не передаете список, вы просто передаете ссылку, указывающую на список. – InBetween

+0

Пока вы не знаете, что у вас проблема с памятью, вам не стоит беспокоиться об этом. То, что вам нужно сделать, это бит профилирования памяти, но, по моему мнению, вы будете пытаться использовать любой значительный объем памяти. – Enigmativity

+0

Я думаю, вам нужно попробовать его и посмотреть, есть ли проблема решить, прежде чем пытаться его исправить. – user1666620

ответ

3

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

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

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

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

+1

"он будет изменен после возвращения из вызываемой функции тоже" - не очень понятно. Он изменится, экземпляр изменился - он не должен возвращаться первым. – Enigmativity

+0

Я приспособию его –

+0

Я не думаю, что изменение сделало его более ясным. Вы все еще говорите об оставшихся изменениях ** при возврате **. Изменения происходят там, где они происходят. – Enigmativity

1

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

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

+0

Теперь я понимаю Спасибо – LittleFunny

1

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

var myObject = new SomeVeryBigAndComplexObject(); 

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

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

var obj = myObject; 
Foo(myObject); 

void Foo(SomeVeryAndComplexObject obj) { ... } 

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

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

+0

Я вижу спасибо – LittleFunny