3

私はそれらが有用である可能性があることを認めますが、実際にメソッドのパラメーターとして関数を使用したいときに頭を包み込もうとしています。

public void WeirdMethod(int myNumber, func op);

デザインと機能の観点から、誰かが私がこれを検討したいいくつかの状況を私に説明できますか?「再利用性」の理論は私にはあまり役に立ちません。現実世界のシナリオが最適です。私があなたのように考えるのを手伝ってください笑。

これが私が知っているすべてについてです:

  • これにより、代理人を渡すことができます
  • これにより、ラムダ式を使用できるようになります。

うん...

注:「正しい」答えがないため、このスレッドは閉じられます。でも、今クリックしたのは「計算の遅れ」だったと思います。

4

5 に答える 5

4
  • 後まで操作を延期します。非常に実用的な例は、オブジェクトツリーが完全に入力されるまで変更の追跡を延期することです。各タイプまたはリポジトリは、実行したいことを通知し、呼び出し元は実際に実行するタイミングを決定できます。

  • 論理の構成(ジャスティン・ニースナーが述べたように)。

  • 抽象化、たとえば(「これは入力と出力を持つコントラクトですが、コントラクトを実行する限り、実装が何であるかは関係ありません)。たとえば、「statusWriter」Funcをメソッドに渡すことができます。コンソール、デバッグウィンドウ、ログファイル、データベース、または何もしません。消費するメソッドは、型を消費し、必要に応じてそれを呼び出すことだけを知っています。

  • 同じように、メソッドにaを渡すと、呼び出し元がwhere述語を定義Funcできるようにする抽象的で単純な方法が可能になります。私はこのパラダイムを頻繁に使用して、結果に適用される厳密に型指定されたフィルターをサポートします(LINQ to SQLについては説明せず、呼び出し元が適切と考える情報のリストをフィルター処理するだけです)。

  • 匿名関数を使用して再帰を示すこの例のような、エレガントな関数型パラダイム。これらの構成は、ある関数を別の関数に渡す機能がなければ、冗長/不可能になります(特に省略形で)。

于 2012-09-28T21:40:26.237 に答える
3

一般的なシナリオは、遅延計算をメソッドに渡す必要がある場合です。これは、何かをキャッシュする場合など、何かが高価な場合に役立ちます。

public Guid GetFromCache(string key, Func<Guid> make) {
    Guid res;
    if (!cache.TryGetValue(key, out res)) {
        res = make();
        cache.Add(key, res);
    }
    return res;
}

これで、このメソッドを次のように呼び出すことができます。

Guid guid = GetFromCache(myKey, () => database.MakeNewGuid());
于 2012-09-28T21:31:57.677 に答える
3

非同期のものがあり、それにコールバックメソッドを与えたい場合は?

于 2012-09-28T21:32:26.287 に答える
0

それらはあなたが機能をカレーすることを可能にするだけでなく、機能的合成を使用することを可能にします。

于 2012-09-28T21:31:18.363 に答える
0

以前はほぼ確実にデリゲートを使用したことがありますが(イベントがそれであるため)、LINQは、関数パラメーターとしてデリゲートを渡す場合の代表的な例です。

について考えてくださいWhere。実行の一部としてそれを使用する関数に、ロジックの一部(具体的には、基準を満たすものの定義-それらが何であれ)を提供します。

于 2012-09-28T21:56:31.553 に答える