2016-09-01 6 views
2

この質問はモバイルアプリケーションには直接発生しません。私はアンドゥとリドゥ機能のためのコマンドパターン関連の構造を作成する必要がありました。私が持つコマンドには、AddStrokeCommand、RemoveStrokeCommand、ClearAllCommandがあります。それぞれは元に戻すことができます。C#:オブジェクトの複雑なリストを別のクラスに渡すとたくさんのメモリが必要になる

インターフェイスには、ExecuteとUnExecuteを持つICommandが必要です。私のコードの

例:

 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

通常、オブジェクトのインスタンスは参照渡しされます。つまり、オブジェクトがメモリにコピーされることはなく、メモリへのポインタのみが渡されます。

これは、メモリの使用に費用がかからず、高性能ヒットでもないという利点があります。

不利な点もあります(ただし、利点もあります)。渡された項目を変更すると、(データのインスタンスが1つしかないため)呼び出し元関数に戻った後も変更はそのまま残ります。

ここでは、詳細を見ることができます:CLASSを渡す https://msdn.microsoft.com/en-us/library/4d43ts61%28v=vs.90%29.aspx

+1

"呼び出された関数から戻った後に変更される" - ひどくはっきりしない。インスタンスが変更されると変更されます。最初に戻る必要はありません。 – Enigmativity

+0

私はそれに適応します –

+0

私は変更がそれをより明確にしたとは思わない。あなたはまだ**戻るときの残りの変化について話します**。変更は、発生するとすぐにそこにあります。 – Enigmativity

1

は、有意なメモリを取ることはありません - Ususallyにoを使用し、わずか数バイトのメモリアドレスを保持します。本質的に、仮想メモリ内のオブジェクトの位置である整数を渡します。 (Googleは「参照渡しセマンティクス」の周りに)

STRUCTは別の問題です。構造体が関数に渡されるか、別の変数に代入されるたびにコピーされるので、ここでコピーを作成することができます。詳細については、「pass-by-valueセマンティクス」を参照してください。次のコードを持っている場合は

+0

私は今理解していますありがとう – LittleFunny

1

は:

var myObject = new SomeVeryBigAndComplexObject(); 

何が起こるかは、あなたが新しいと非常に大きなオブジェクトを作成し、以前にランタイムによって割り当てられたいくつかのメモリに格納することです。 myObjectに格納されている場合、SomeVeryBigAndComplexObject参照タイプclass)である場合、オブジェクト自体ではなく、そのオブジェクトの場所のメモリアドレスです。

だから、あなたは、次のいずれかを行うとき:

var obj = myObject; 
Foo(myObject); 

void Foo(SomeVeryAndComplexObject obj) { ... } 

何が本当に単にmyObjobjを参照に保存されているをコピーして行っている、いないオブジェクト自体。これは非常に安価で、あなたはそれについてまったく心配すべきではありません。

参照タイプの場合、これがすべて該当することに注意してください。オブジェクトが値タイプstruct)であった場合、オブジェクト自体は変数myObjectの値であるため、オブジェクト自体がコピーされます。それが構造体が常に小さなオブジェクトでなければならない理由の1つです。

+0

ありがとう – LittleFunny

関連する問題