2009-08-21 12 views
17

私はC#の中に、例えばAS3のような関数型があるかどうかを知りたいです。私はこのようなsomnthing(ただし、C#で)をしたいと思っ:C#に関数型がありますか?

(関数への参照)
private function doSomething():void { 
    // statements 
} 

var f:Function = doSomething 
f() 

答えて

33

はい、.NETではデリゲートと呼ばれ、関数型ではありません。

予約キーワードdelegateを使用して新しいキーワードを定義します。クラスライブラリにあらかじめ定義されているものがたくさんあります。それを割り当てることがその後

public delegate void DoSomethingDelegate(Object param1, Object param2); 

DoSomethingDelegate f = DoSomething; 
f(new Object(), new Object()); 

基本クラスライブラリで定義されたデリゲート型の一般的な2つの種類、その方法のための1つもありますあなたの例と一致するものを定義するには

価値を返す、そして、そうでない人のために1つ、そしてあなたが持っている引数の数に変化があります。

2つは、値を返すメソッドの場合はFunc<..>、そうでない場合はAction<..>です。

あなたのケースでは、これは動作します:

Action<Object, Object> f = DoSomething; 
f(new Object(), new Object()); 

注意をこの最後の場合には、あなたがDoSomethingDelegateを宣言する必要はありません。

+2

FuncとActionはLinqで頻繁に使用されています。 – Dykam

+0

問題は、独自のFunc実装を作成できないため、悲しいことに、それをカットしないということです。 – Rolf

6

彼らと呼ばれている代表者

ここで素晴らしいプライマーだ:http://www.akadia.com/services/dotnet_delegates_and_events.html

+0

どのように実装されていますか? –

+2

彼らはバックグラウンドで完全なクラスですが、コンストラクタは関数を受け取りますが、C#2と3はその事実を完全に遠ざけました。これは良いことです。 – Dykam

8

delegatesの概念。 NETはまさにあなたが探しているものです。

リンクされたページには例がありますが、多くのチュートリアルやそれらの実装方法や使い方の詳細な説明もあります。 Google away!

5

はい、Delegatesという種類の安全な関数ポインタがあります。たとえば...

void Main() 
{ 
    object o1 = new object(); 
    object o2 = new object(); 

    Action<object, object> act = DoSomething; 
    act(o1, o2); 
} 

private void DoSomething(object o1, object o2) 
{ 
    // do that thang 
} 

Action<T>

Lambda Expressions呼ばれる匿名関数がある

public delegate void Action<T1, T2>(T1 arg1, T2 arg2) 

...デリゲートに構築されています。たとえば...

List<int> lst = new List<int>() { 1, 2, 3, 4, 5 }; 
    var res = lst.Where(l => l > 3); 

Whereメソッドの引数はラムダ式です。 Eric Whiteさんのブログで、この記事に関する素晴らしいディスカッションをご覧ください:Query Composition Using Functional Programming Techniques in C# 3.0

4

私はあなたがC#デリゲートタイプを探していると思います。

delegate void DoSomethingDelegate(object obj1, object obj2); 

    void DoSomething(object a, object b) 
    { 
    } 

    void RunDoSomething() 
    { 
     //use your delegate 
     DoSomethingDelegate d = new DoSomethingDelegate(DoSomething); 
     d(new object(), new object()); 

     //alernatively, use the built in generic version 
     Action<object, object> d2 = new Action<object, object>(DoSomething); 
     d2(new object(), new object()); 

    } 
関連する問題