2009-05-23 3 views
11

Bitmapオブジェクトを多数のメソッド(約10)に渡す必要がある場合、最終的に使用後に最終的に処理されるイベントには、パフォーマンス価値の代わりに参照によってそれらのメソッドのすべてに渡すのが有益です)。C# 'ref'キーワード、パフォーマンス

値渡しでオブジェクトがコピーされ、参照渡しでコピーされます。あなたはビットマップを保持するため、正確に使用しているタイプ

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

+0

vb.net:[より速いbyval-or-byref](http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal

+0

今やどのようにしてビットマップを値で渡すことができるでしょうか。 – IllidanS4

答えて

30

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

7

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

refキーワードを使用すると、同じ参照が渡される(参照のコピーは作成されません)以外は、パフォーマンスにあまり影響しません。それは唯一のパラメータを取る方法はそれを修正することができ、呼び出し元が変更された値のポストの実行を得ることが意図をクリアし、次のような利点

  • を持っています。
  • 変数は、呼び出された関数への引数としてrefパラメータを渡す前に、呼び出し先によって初期化されなければなりません。
+0

おかげさまで、ありがとうございました! –

+0

"refキーワードを使用すると、インテントのみが消去されます"。うーん、私はそれが本当だとは思わない。リファレンス渡し参照(オブジェクト**)は、呼び出し元によって再割り当てされることがあります。呼び出し元が参照するオブジェクトに影響を与えます。リファレンスby-value(オブジェクト*)を渡すと、参照のコピーが渡され、呼び出し元リファレンスがcalle内の変更から隔離されます。この記事http://preview.tinyurl.com/oda4jzにはC#の例があります。 – corlettk

+0

正解。したがって、refパラメータを取るメソッドは、呼び出し元が引数の前にrefを明示的に記述して、呼び出し元が意味を理解して同意することを保証します。これは、呼び出し元が、引数がメソッド呼び出しをポストする異なる値/状態を持つ可能性があることを完全に知っている引数を渡しているという意図を明確にします。 – Gishu

15

ビットマップは参照型なので、既にこのメソッドを参照して渡されているので、このシナリオでのパフォーマンスには実用上の違いはありません。

「参照による」と「値による」がC#でどのように機能するかについて詳しくは、Jon Skeet's article on the subjectをお勧めします。

+0

記事へのリンクをありがとう、本当に私を助けた。それは蕾を歓迎します –

+0

素敵な記事の推薦。値/参照型と値/参照渡しのパラメータを完全に理解するのはすばらしいことです。 –

5

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

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

オブジェクトが構造体(または列挙型またはその他の基本型)の場合、 'ref'キーワードは構造体を格納する変数への参照を渡しますが、使用するたびに逆参照のSLIGHTそれを指定しなければ、プログラムは構造体の新しいインスタンス用にメモリを割り当ててからそれをコピーしなければなりません。ほとんどの場合、refキーワードを介して構造体を渡す方が速いですが、構造体が本当に小さければ、そうでないかもしれません。また、逆参照されている場合(そしてLOTを意味します)。

構造体を渡している場合、通常は参照が行なわれます。そうでなければ、実際にはほとんど違いはありません(逆参照フェーズのオーバーヘッドはごくわずかです)。

ああ、実際には質問に答えるには、ビットマップはクラスなので、 'ref'キーワードは実際には非-filfパラメータに比べてスピードの違いはありません。

+0

+1は構造体の参照渡しの利点を指摘し、逆参照のパフォーマンスへの影響をより詳細に説明します。 – Didaxis

関連する問題