戻り値型のないFuncデリゲート


561

すべてのFuncデリゲートは値を返します。voidを返すメソッドで使用できる.NETデリゲートは何ですか?

回答:


760

すべてのFuncデリゲートは何かを返します。すべてのアクションデリゲートはvoidを返します。

Func<TResult> 引数を取らず、TResultを返します。

public delegate TResult Func<TResult>()

Action<T> 引数を1つ取り、値を返しません。

public delegate void Action<T>(T obj)

Action 最も単純な「ベア」デリゲートです:

public delegate void Action()

そこにもだFunc<TArg1, TResult>し、Action<TArg1, TArg2>(およびその他16個の引数まで)。これらすべて(を除くAction<T>)は.NET 3.5(System.Coreで定義)の新機能です。


11
参考までに、ベースクラスライブラリの次のバージョンには、4つ以上の仮パラメーターをサポートするFuncおよびActionタイプが含まれます。彼らがどれほど大きくなるか正確には思い出せない。
Eric Lippert、

88
.NET 4.0では、最大8つのパラメーターになりました。彼らがこれを続ければ、次のバージョンでは11まで上がるでしょう!! 11 !!!
Michiel van Oosterhout、2010年

9
実際には、4.0で16に増えたようです。
Tustin2121

7
1、4、16、64、256、1024、4096、16384、65536、...これは、将来のある時点で現在よりも多くの引数を関数に処理できるようにする必要があることを明確に示しています。 !
Chris Morgan、

6
実際、Tustin2121は正しいです。それらはFunc<,,, ... ,>.NET 4.0で最大16個のパラメーター(およびの場合は戻り値の型)に達しましたが、各 "シリーズ"の最後の8つの型は、System.Core.dllではなくで定義されてmscorlib.dllいるため、これが理由ですmichielvooがそれらを見なかった理由。ただし、.NETバージョン4.5および4.5.1では、FuncまたはActionは追加されていません。このシーケンスはA170836またはA170875になりますか?乞うご期待。
Jeppe Stig Nielsen

83

...引数を取らず、戻り値の型が無効ですか?

Actionはこれに対する解決策であると信じています。


47

すべてのFuncデリゲートは少なくとも1つのパラメーターを取ります

それは真実ではない。それらはすべて少なくとも1つの型引数を取りますが、その引数が戻り型を決定します。

したがってFunc<T>、パラメーターを受け入れず、値を返します。値を返さない場合は、Actionまたはを使用Action<T>します。


27

やってみSystem.Func<T>System.Action


1
ただし、0引数や.Net 2.0には存在しないものはないと思います。
ブライアン

1
奇妙なことです。Funcは.Net 2.0にはまったく存在しませんが、PredicateとActionには存在します。
Joel Coehoorn、2009年

2
.NET 2.0の場合は、MethodInvokerデリゲートを使用します。
Trevor Elliott

.NET 2にも、後者のConverter<TInput, TOutput>ようなデリゲート型がありました(またはありました)Func<T, TResult>。これは、のList<>.ConvertAllすべての要素List<>を別のオブジェクトに投影し、すべての「関数値」を新しいに配置するメソッドで使用されましたList<>。(後で、Linq Selectをよく使用します。)
Jeppe Stig Nielsen

0

場合によっては、イベント処理のデリゲートを作成する必要があります。その場合、から派生する2番目のパラメーターに加えて、System.EvenHandler<T>型の引数を暗黙的に受け入れることを利用できobjectますEventArgs。EventHandlerが返されますvoid

私は個人的に、関数本体で1回限りのコールバックを作成するためのテスト中に、これが便利だと感じました。


0

...引数を取らず、戻り値の型が無効ですか?

のためSystem.Windows.Formsに書いているなら、あなたも使うことができます:

public delegate void MethodInvoker()

0

戻り値と非戻り値のサブルーチンを呼び出す非常に簡単な方法。それぞれFuncActionを使用しています。https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx参照

この例を試してください

using System;

public class Program
{
    private Func<string,string> FunctionPTR = null;  
    private Func<string,string, string> FunctionPTR1 = null;  
    private Action<object> ProcedurePTR = null; 



    private string Display(string message)  
    {  
        Console.WriteLine(message);  
        return null;  
    }  

    private string Display(string message1,string message2)  
    {  
        Console.WriteLine(message1);  
        Console.WriteLine(message2);  
        return null;  
    }  

    public void ObjectProcess(object param)
    {
        if (param == null)
        {
            throw new ArgumentNullException("Parameter is null or missing");
        }
        else 
        {
            Console.WriteLine("Object is valid");
        }
    }


    public void Main(string[] args)  
    {  
        FunctionPTR = Display;  
        FunctionPTR1= Display;  
        ProcedurePTR = ObjectProcess;
        FunctionPTR("Welcome to function pointer sample.");  
        FunctionPTR1("Welcome","This is function pointer sample");   
        ProcedurePTR(new object());
    }  
}

1
このコードスニペットをお寄せいただきありがとうございます。このコードスニペットは、限られた、即時の助けを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。答えを編集して、仮定を含めて説明を追加してください。
iBug 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.