English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 匿名メソッド

顾名思义,匿名方法是没有名称的方法。可以使用委托(delegate)关键字定义C#中的匿名方法,并且可以将其分配给委托(delegate)类型的变量。

在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。

public delegate void Print(int value);
static void Main(string[] args)
{
    Print print = delegate(int val) { 
        Console.WriteLine("匿名方法内部。值: {0}", val); 
    };
    print(100);
}
输出:
匿名方法内部。值:100

匿名方法访问外部函数定义的变量

匿名方法可以访问外部函数中定义的变量。

public delegate void Print(int value);
static void Main(string[] args)
{
    int i = 10;
    
    Print prnt = delegate(int val) {
        val +=
        Console.WriteLine("匿名方法: {0}", val); 
    };
    prnt(100);
}
输出:
匿名方法:110

匿名方法作为参数

也可以将匿名方法传递给接受委托作为参数的方法。

在下面的示例中,PrintHelperMethod()采用Print委托的第一个参数:

public delegate void Print(int value);
class Program
{
    public static void PrintHelperMethod(Print printDel, int val)
    { 
        val += 10;
        printDel(val);
    }
    static void Main(string[] args)
    {
        PrintHelperMethod(delegate(int val) { Console.WriteLine("匿名方法: {0}", val); }, 100);
    }
}
输出:
匿名方法:110

匿名方法可用作事件处理程序

saveButton.Click += delegate(Object o, EventArgs e)
{ 
    System.Windows.Forms.MessageBox.Show("Save Successfully!"); 
};

C#3.NET 4.0 で lambda 表現が導入されました。これも匿名メソッドのように動作します。

匿名メソッドの制限

  • goto、break、または continue などのジャンプ命令を含むことはできません。

  • 外部メソッドの ref または out パラメータにアクセスすることはできません。

  • 不安全なコードを所有したりアクセスすることはできません。

  • is 演算子の左側で使用することはできません。

 覚えておくべきポイント

  1. delegate キーワードを使用して匿名メソッドを定義できます。

  2. 匿名メソッドはデリゲートに割り当てられなければなりません。

  3. 匿名メソッドは外部変数や関数にアクセスできます。

  4. 匿名メソッドは引数として渡すことができます。

  5. 匿名メソッドはイベントハンドラとして使用できます。