2016-09-13 14 views
1

私はReSharperののリリースされたばかりのバージョン(2016年2月2日)(なぜ)拡張メソッドとして優先されている方法を呼び出すのですか?

このフラグのコード行使用して、私の解決策をresharpeningの過程で午前:私がすべきことをintimating ...

ReportRunnerConstsAndUtils.ConvertValueToAppropriateTypeAndAssign(totalPackagesCell, packages); 

を「拡張メソッドとして起動」私は黙認した場合

、それはこれにその行を変更します。

totalPackagesCell.ConvertValueToAppropriateTypeAndAssign(packages); 

これは良いですか?もしそうなら、どうですか?どうして?

ここ「ConstsAndUtils」クラスであると呼ばれている方法であり、コメントの一部が示されているよう

// Adapted from https://stackoverflow.com/questions/26483496/is-it-possible-to-ignore-excel-warnings-when-generating-spreadsheets-using-epplu 
public static void ConvertValueToAppropriateTypeAndAssign(this ExcelRangeBase range, object value) 
{ 
    string strVal = value.ToString(); 
    if (!String.IsNullOrEmpty(strVal)) 
    { 
     decimal decVal; 
     double dVal; 
     int iVal; 

     if (decimal.TryParse(strVal, out decVal)) 
      range.Value = decVal; 
     if (double.TryParse(strVal, out dVal)) 
      range.Value = dVal; 
     else if (Int32.TryParse(strVal, out iVal)) 
      range.Value = iVal; 
     else 
      range.Value = strVal; 
    } 
    else 
     range.Value = null; 
} 
+5

私は確かにきれいに見えます。 ReSharperは多くのプリファレンスタイプの推奨をしています。あなたが好きではない場合は、オプションでオフにすることができるはずです。 – itsme86

+1

itsme86が言うように、それは個人的な好みです... ReSharperには、リバースリファクタを実行するオプションもあります。 "拡張機能を平静に変換する" https://www.jetbrains.com/resharper/features/code_refactoring.html#Convert_Extension_Method_to_Plain_Static –

+1

これは意見に基づいています。それをするための良い方法はありません。ほとんどの人は、extensiónメソッドがより洗練されていると思っていますが、それについてはそうです。あなたが投稿したコードについて、 'double.TryParse'はいつ呼び出されるのですか?(途中であなたの行方不明)。 – InBetween

答えて

3

、これは、少なくとも部分的に好みの問題です。個人的には、ここでは拡張メソッドを使用するのが「よりクリーン」で明確になっていると思いますが、一部の人々はこれに同意しないかもしれません。

もちろん、拡張メソッドは静的メソッド(実際のインスタンスメソッドではありません)です。コンパイラがここに構文的な砂糖を与えているだけです。

1

これは意見に基づいた質問であり、本当に答えることはできませんが、次の点を指摘したいと思います。

この特定のケースでは、メソッドがvoidを返すため、拡張メソッドは使用しません。何かを返さず単に副作用を起こさないメソッドは良い拡張メソッドの候補ではなく、標準の静的メソッド呼び出しとして読みやすくなっています。

私は拡張メソッドを「純粋な」ポーズで保つようにしていますが、私が言ったように、これは私の個人的意見です。

これについて考えるならば、C#の非常に機能的な側面であるLINQを可能にする拡張メソッドが実装されました。私は、私が実装している拡張メソッドで同じ "感じ"を保つ傾向があります。

+0

私はOPの質問を意見に基づいて取っていませんでした。 OPはなぜRe-Sharperが提案したのか尋ねました。 Re-Sharperが個人的な好みに基づいて提案をするという事実は意見ではない。 ReSharperのは、提案を行っていることを –

+0

@devlincarnateは明らかに事実であり、私はそれが意見ベースの質問であることを主張していないんだけど、あなたはOPの質問に丁寧に読めば、あなたは、彼はまた、どのように、何が、なぜ求めていることに気づくでしょうResharperの提案はより良く、それらのより重要な質問への答えは意見に基づいています。 – InBetween

2

あなた(または誰か)が拡張メソッドとして作成したため、拡張メソッドとして呼び出すことをお勧めします。構文this ExcelRangeBase rangeはそのメソッドを拡張メソッドにします。したがって、一貫性のためには、呼び出されるときに拡張メソッドとして使用する必要があります。それ以外の場合は、ReportRunnerConstAndUtils.ConvertValueToAppropriateTypeAndAssign(range)と、range.ConvertValueToAppropriateTypeAndAssign()と同じことをする行を読み取る行があります。

C#6ではいくつかの新しい構文が導入されました。ファイルの先頭にusing ReportRunnerConstAndUtils、次にコールサイトでConvertValueToAppropriateTypeAndAssign(範囲)を設定できます。

+0

よろしくお願いします。私が興味深いのは、私がこれをするとき、私はもはや拡張メソッドがどこにあるか指定する必要がないということです。 "間違った"方法で、メソッド名の前に "ReportRunnerConstsAndUtils"(パブリックメソッドを含む.csファイル)を追加する必要があります。それを「正しい」方法で行うことは不要です。私は本当に不平を言っていませんが、なぜ私は不思議です。 –

+1

@ B.ClayShannon:理由は、C#はVBとは異なり、自動的にすべての静的クラスをスコープにプルしないため、メソッド(パラメータ)構文を指定するとコンパイラは文字通り一致するメソッドを見つけることができません。これはC#6で若干微調整された設計の選択でしたが、スコープに取り込むクラスを指定できるようになりました。クラス名がなくてもクラスを見つけることができます。 – jmoreno

関連する問題