13

これは、ご存知の皆さんへの好奇心に関する質問です。

メソッドの代わりに Func を使用することに害や欠点はありますか? 簡単な例:

private static Func<int, int, DBContext, List<T>> Foo =
    (i1, i2, dbc) =>
        (i1 != 0) ? dbc.Bar(i2) : new List<T> { /*some default values ...*/ };

private static List<T> Foo(int i1, int i2, DBContext dbc)
{
    return i1 != 0 ? dbc.Bar(i2) : new List<T> { /*some default values ...*/ };
}
4

6 に答える 6

11

いくつかの欠点があります。

  • パフォーマンスへの影響 (デリゲート vs メソッド) - 小さいが存在する
  • パラメーター名なし (呼び出しの可読性を損なう)
  • 定義自体が読みにくい
  • オーバーロードは不可能 (xanatos のおかげ)

あなたは何も得られないので、私はローカルで小さなコンテキストでのみそうし、静的メソッドを好みます

于 2011-08-24T07:45:06.770 に答える
5

パフォーマンスは、最初に思われるほど多くの議論ではなく、デリゲートとv_table(仮想インスタンス メソッド) を介してディスパッチされるメソッドを呼び出すコストは同等です。この場合、静的メソッドの場合、デリゲートを使用しないことでパフォーマンスがわずかに向上する可能性があります。

ここで発見した「トリック」は、オブジェクト指向プログラミング手法 (たとえば、ストラテジー パターン) に頼らずに機能分割を実現するかなり一般的な手法です。メソッド呼び出しをデリゲートへの呼び出しに置き換えます。このトリックのもう 1 つの優れた点は、呼び出しの構文が同じであることです。

ただし、この手法の適用には細心の注意を払っています。私が通常それを使用するのは、1 つまたは 2 つ以上のパラメーターを持たない単一のメソッドを持つインターフェイスを避けることです (それ以外の場合は、パラメーター オブジェクトの使用またはインターフェイスの使用を検討します)。

C# はマルチパラダイム言語であり、それぞれのパラダイムを使用する場所があります。関数型パラダイム (コンパイル時の既知のメソッドの代わりに Funcs を使用するなど) には、オブジェクト指向パラダイムと同様に、その場所があります。あなたの場合、を使用する利点はありませんFunc<>。代わりに、わかりやすくするために従来の方法を使用する必要があります。

于 2011-08-24T07:54:45.750 に答える
4

最初のケース (Func を使用) では、メソッドを作成するのではなく、特定のデリゲートで初期化する変数 Foo を作成します。Foo が指すものを変更するために使用できる 1 つのレベルの間接化があります。例を単純化するには:

public static class Test {

    public static Func<int, int, int> Foo =
        (i1, i2) =>
            i1 + i2;

    public static int Foo2(int i1, int i2)
    {
        return i1 + i2;
    }
}

テストしましょう:

int a = Test.Foo(2,3);
int b = Test.Foo2(2,3);

Console.WriteLine("{0}, {1}",a,b); // 5, 5, all seems good, they're both sums

    //... but wait... now you can do this:
Test.Foo = (x,y) => x * y; //reassigning Foo
int c = Test.Foo(2,3);
Console.WriteLine("{0}",c); // 6 

したがって、このレベルの間接化を使用している場合は、Func アプローチが理にかなっています。しかし、それを使用していない場合は、あるレベルの間接化を導入しすぎて、パフォーマンス、コードがその意図をどれだけうまく伝えるか、およびプログラムの正確さに影響を与えています (メソッドを別のメソッドに切り替えることができるため)。実行時に何か違うことをします)

于 2011-08-24T08:01:14.897 に答える
2

理想的には、Func の定義が常に 1 つだけ存在する場合は、Func を作成したくありません..コードの複雑さと読みやすさを不必要に増やしているため、保守性に影響を与えています..

特定の条件に基づいて Func を動的に作成するなど、それを使用する強い理由がある場合は、 Func<> を使用することが正当化されます..

アクションもご覧ください。これは、いつ何を使用するかを説明するために読んだブログです: http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/

于 2011-08-24T07:48:27.343 に答える
2

「学習帳」という観点からすれば同じはずなのですが、

  • ラムダ/デリゲートはメソッドよりも少し遅いため、パフォーマンスへの影響は小さい
  • パラメータには一般的な名前があります (例: arg1arg2)
  • インテリセンスは通常、ドキュメントのツールチップを提供できません
  • ラムダ フィールドとして定義されたメソッドは、新しいジェネリック パラメーターを導入できません
  • 読みやすさへの影響
于 2011-08-24T07:55:36.200 に答える
1

読みやすさのダウングレードを除けば、他に害はないと思います。コードがどのようにコンパイルされるかはわかりませんが、最初のバージョンではデリゲートを使用して関数を定義しているだけです。次のこともできると思います。

private static List<T> Foo(int i1, int i2, DBContext dbc)
{
    i1 != 0 ? return dbc.Bar(i2) : return new List<T> { /*some default values ...*/ };
}

private static Func<int, int, DBContext, List<T>> Foo2 = Foo;
于 2011-08-24T07:45:07.860 に答える