2013-04-23 9 views
5

iは静的関数ここで、戻りまたはREF

次のグループがあると私は、参照によって変数を送った:

public static void ProcessEmailMessage(ref string HTML) 
     { 
      ModifyLinks(ref HTML); 
      AddFakeImage(ref HTML); 
     } 

     public static void ModifyLinks(ref string HTML) 
     { 
      //modify HTML links 
     } 


     public static void AddFakeImage(ref string HTML) 
     { 
      //adds an image to the HTML 
     } 

、ここでiは値によって変数を送信

public static string ProcessEmailMessage(string HTML) 
     { 
      HTML = ModifyLinks(HTML); 
      HTML = AddFakeImage(HTML); 
      return HTML; 
     } 

     public static string ModifyLinks(string HTML) 
     { 
      //modify HTML links 
      return HTML; 
     } 


     public static string AddFakeImage(string HTML) 
     { 
      //adds an image to the HTML 
      return HTML; 
     } 

2つの間にパフォーマンスの違いはありますか?

+2

** b)** ......... – I4V

答えて

8

可能であれば、outパラメータとrefパラメータを使用しないでください。

refとoutパラメータを使用する方が使いにくいので、結果を保持する変数を宣言する必要があります。セマンティクスは理解しにくいものです。性能の相違(もしあれば)は無視できる。

Visual Studioでのコード分析では、この場合に警告が表示される可能性があります。

詳細は、http://msdn.microsoft.com/en-us/library/ms182131を参照してください。

+1

外部ドキュメントへのリンクは良好ですが、ここに概要を含める必要があります。外部リンクが破損した場合でも、SOの回答は有効です。 – cdhowie

+0

@cdhowie:これを指摘してくれてありがとう。私はポストを編集してもう少し要約を追加しました。 – DeCaf

2

refを使用すると、パフォーマンスにヒットする可能性が高くなります。これは、変数に割り当てるときに間接的に間接的なレベルになるためです。しかし、この差はごくわずかです。

これは実際に何が起こっているかのより多くの例示であり、あなたが好みなら一緒に呼び出す連鎖方式にできますように私は、文字列を返すフォームを好む:

return AddFakeImage(ModifyLinks(HTML)); 

refフォームあなたと変数を宣言するための呼び出しコードを強制し、そうでなければ必要ないかもしれません。これは読みやすさを妨げ、意味のない定型コードの発生率を増加させます。

+0

技術的には、どちらの場合でも変数が宣言されています。プログラマがそれについて知る必要があるかどうかという問題です。指定したコードサンプルには、暗黙の名前のないローカル変数が存在します。それについて知る必要はありませんが、パフォーマンスの観点から言えば、実際にはそれほど違いはありません。 – Servy

+0

@Servy JITコンパイル時にレジスタが存在しますが、ここで示したコード例では、元のコードよりもローカルであることを宣言しています。短縮されたILは 'ldarg.0;コール;コール; ret;したがって、少なくとも、ネイティブコードへの翻訳までは、「追加変数」はありません。 (変数はネイティブコード、実際のレジスタやメモリ位置には存在しません。変数の概念はネイティブコードよりも高いレベルです)。 – cdhowie

+0

どちらの場合も、名前付きローカルかどうかにかかわらず、実際のプロセッサの命令レベルはどちらもかなり登録されている可能性が高いですが、おそらくそうでなければ両方ともメモリのある場所に格納される可能性があります。 – Servy

1

2つのパフォーマンスの差はごくわずかです。これは、文法の優先性の問題です。

標準の規則では、参照渡しのパラメータを変更するのではなく、新しい文字列を返すことになります。 (フィールドの代わりにメソッドやプロパティの戻り値を渡すなどの)名前付き変数を持たない場合など、使いやすい場合がいくつかあります。

1

違いはあまりありませんが、私は "リターン"に行きます。可能であれば、 "ref"を避けてください。 REFと

の理由は、あなたが別の呼び出しの結果を渡す前に、変数を宣言する必要はないとあなたがチェーンコールをすることができますです

string modifyMe = GetMeString(); 
ModifyLints(ref modifyMe); 
AddFakeImage(ref modifyMe); 

は返すために比較:

string result = AddFakeImage(ModifyLinks(GetMeString())); 
1

複数のオブジェクトを返す必要がある場合は、returnで行うことができる場合は、objを1つ返すだけでref/outを使用できます、returnを使用してください。
refは、コードを不必要に不明瞭にし、この場合不要な書込みオーバーヘッドを生成します。
コードをシンプルにして概要を把握してください。

1

は私が行うビルダーのようなものを好む:。

新しいEmailMessageProcessor(HTML).WithModifiedLinks()WithFakeImages()。

ref引数はなく、すべてがカプセル化されています。

関連する問題