13

多数のメソッド(約10)に渡す必要のあるビットマップオブジェクトがあり、最終的に使用後に最終的に破棄されるイベントに渡す場合、(パフォーマンスの観点から)すべてのメソッドに渡すことが有益でしょうか。値の代わりに参照によるそれらのメソッド?

値を渡すと、オブジェクトがコピーされ、参照によって渡されません。

(この状況ではパフォーマンスが重要です。アプリケーションは可能な限り高速に実行する必要があります。)

4

4 に答える 4

34

ビットマップは参照型です。参照型を値で渡すと、オブジェクトはコピーされず、オブジェクトへの参照のみがコピーされます。値ではなく参照によってビットマップを渡すことによるパフォーマンス上の利点はありません。

于 2009-05-23T05:21:06.957 に答える
18

ビットマップは参照型であるため、このシナリオでは、メソッドへの参照によって既に渡されているため、パフォーマンスに実際的な違いはありません。

C#で「参照による」および「値による」がどのように機能するかを完全に説明するために、このテーマに関するJonSkeetの記事をお勧めします。

于 2009-05-23T05:28:42.157 に答える
10

ビットマップを保持するために正確にどのタイプを使用していますか?たとえば、System.Drawing.Bitmapは参照型/クラスです。メソッドへの参照を(引数として)渡すと、参照は値で渡されます。(参照のコピーが作成されます...オブジェクトではありません)したがって、コピーを保持するために4バイトが32ビットマシンに割り当てられます。

refキーワードを使用しても、同じ参照が渡される(参照のコピーは作成されない)ことを除いて、パフォーマンスにはあまり影響しません。以下のメリットがあります

  • パラメータを受け取るメソッドがパラメータを変更する可能性があるという意図をクリアするだけであり、呼び出し元は実行後に変更された値を取得する可能性があります。
  • また、変数は、refパラメーターを受け取る呼び出された関数に引数として渡される前に、呼び出し先によって初期化される必要があります。
于 2009-05-23T05:20:50.327 に答える
8

「ref」はオブジェクト自体を関数に渡すのではなく、格納されている変数への参照を渡します。

オブジェクトがクラスまたはインターフェイスの場合、関数でその変数にアクセスするたびに、その変数を逆参照してから変数にアクセスする必要があります。「ref」キーワードなしで渡された場合は、逆参照ステップを実行する必要はありません (したがって、わずかに高速になります)。

オブジェクトが構造体 (または列挙型またはその他の基本型) である場合、'ref' キーワードは構造体を格納する変数への参照を渡します。指定しない場合、プログラムは構造体の新しいインスタンスにメモリを割り当ててからコピーする必要があります。ほとんどの場合、ref キーワードを介して構造体を渡す方が高速ですが、構造体が非常に小さい場合や、逆参照が多い場合 (つまり、LOT の場合) はそうではない可能性があります。

したがって、構造体を渡す場合は、通常 ref を使用します。それ以外の場合は、実際には大きな違いはありません (逆参照フェーズのオーバーヘッドはごくわずかです)。

ああ、実際に質問に答えるために、ビットマップはクラスであるため、「ref」キーワードは「ref」以外のパラメーターよりも実際には速度に違いはありません。

于 2009-05-23T05:58:50.460 に答える