5

次の静的関数のグループがあるとします

ここで私は参照によって変数を送信しました:

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
        }

そしてここで変数を値で送信しました

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つの間にパフォーマンスの違いはありますか?

4

6 に答える 6

8

可能であれば、out パラメーターと ref パラメーターの使用を避けてください。

ref および out パラメーターを使用するメソッドは使用が難しく、結果を保持するために変数を宣言する必要があり、セマンティクスを理解するのが少し難しくなります。パフォーマンスの違い (あるとしても) は無視できます。

この場合、Visual Studio のコード分析は、それらの使用に対して警告を発する可能性があります。

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

于 2013-04-23T17:42:27.887 に答える
2

refを使用すると、変数への代入時に余分なレベルの間接化が発生するため、パフォーマンス ヒットが大きくなる可能性があります。ただし、この違いは無視できる可能性があります。

これは実際に何が起こっているかをより具体的に示しており、必要に応じてメソッド呼び出しを連鎖させることができるため、文字列を返すフォームをお勧めします。

return AddFakeImage(ModifyLinks(HTML));

refフォームを使用すると、コードを呼び出して変数を宣言するように強制できますが、それ以外の場合はその必要がない場合があります。これは可読性を妨げ、無意味なボイラープレート コードの発生率を高めます。

于 2013-04-23T17:42:36.230 に答える
1

2 つのパフォーマンスの違いはごくわずかです。それはほとんど完全に構文に対する好みの問題です。

標準的な規則では、参照によって渡されたパラメーターを変更するのではなく、新しい文字列を返す必要があります。より簡単に使用できる場合がいくつかあります (つまり、名前付き変数がない場合。たとえば、フィールドの代わりにメソッドまたはプロパティの戻り値を渡したい場合)。

于 2013-04-23T17:42:39.710 に答える
1

大きな違いはありませんが、「戻る」を使用します。可能であれば、「ref」を避けてください。

その理由は、別の呼び出しの結果を渡す前に変数を宣言する必要がなく、呼び出しを連鎖できるからです。

参照付き:

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

戻り値と比較:

string result = AddFakeImage(ModifyLinks(GetMeString()));
于 2013-04-23T17:43:01.237 に答える
1

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

于 2013-04-23T17:44:32.317 に答える
1

私はビルダーのようなものを好みます:

新しい EmailMessageProcessor(html).WithModifiedLinks().WithFakeImages().

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

于 2013-04-23T17:45:53.947 に答える