 C# 匿名方法
C# 匿名方法
  C# 中,匿名方法是一种不具名的方法,可以被用来传递给委托或者 Lambda 表达式。匿名方法被称为匿名是因为它没有名称,仅被定义在另一个方法或代码块的内部。使用匿名方法可以更加简洁和灵活地编写代码。
# 委托与匿名方法
委托是一种可以封装方法的类型。当我们需要将一个方法作为参数传递给另一个方法或者存储一个方法时,我们可以使用委托。在 C# 中,委托可以通过声明一个委托类型来定义,然后实例化一个委托对象并将其作为参数传递给方法。
下面是一个示例,展示了如何使用委托类型定义一个委托,然后实例化一个委托对象并将其作为参数传递给 DoSomething 方法。
delegate void MyDelegate(string name);
class Program
{
    static void Main(string[] args)
    {
        MyDelegate myDelegate = new MyDelegate(SayHello);
        DoSomething(myDelegate);
    }
    static void DoSomething(MyDelegate myDelegate)
    {
        myDelegate("John");
    }
    static void SayHello(string name)
    {
        Console.WriteLine("Hello, " + name);
    }
}
上面的示例中,我们定义了一个名为 MyDelegate 的委托类型,该委托类型接受一个 string 类型的参数并返回 void。然后我们实例化了一个 MyDelegate 类型的委托对象 myDelegate 并将其赋值为 SayHello 方法。最后,我们将 myDelegate 作为参数传递给 DoSomething 方法。
现在,我们可以使用匿名方法来替代 SayHello 方法,并将其作为参数传递给 myDelegate 委托对象。下面是一个使用匿名方法的示例:
delegate void MyDelegate(string name);
class Program
{
    static void Main(string[] args)
    {
        MyDelegate myDelegate = delegate(string name)
        {
            Console.WriteLine("Hello, " + name);
        };
        DoSomething(myDelegate);
    }
    static void DoSomething(MyDelegate myDelegate)
    {
        myDelegate("John");
    }
}
在上面的示例中,我们使用了 delegate 关键字来定义一个匿名方法,该匿名方法接受一个 string 类型的参数并返回 void。然后我们实例化了一个 MyDelegate 类型的委托对象 myDelegate 并将其赋值为该匿名方法。最后,我们将 myDelegate 作为参数传递给 DoSomething 方法。
# Lambda 表达式与匿名方法
Lambda 表达式是一种可以产生委托或表达式树类型的匿名函数。Lambda 表达式通常用于简化代码,因为它们可以在一行代码中定义一个委托并传递给另一个方法。
下面是一个使用 Lambda 表达式的示例,我们使用 Lambda 表达式替代了前面示例中的匿名方法:
delegate void MyDelegate(string name);
class Program
{
    static void Main(string[] args)
    {
        MyDelegate myDelegate = name => Console.WriteLine("Hello, " + name);
        DoSomething(myDelegate);
    }
    static void DoSomething(MyDelegate myDelegate)
    {
        myDelegate("John");
    }
}
在上面的示例中,我们使用 => 符号定义了一个 Lambda 表达式,该表达式接受一个 string 类型的参数 name 并返回 void。然后我们实例化了一个 MyDelegate 类型的委托对象 myDelegate 并将其赋值为该 Lambda 表达式。最后,我们将 myDelegate 作为参数传递给 DoSomething 方法。
需要注意的是,Lambda 表达式只能用于产生委托或表达式树类型,而匿名方法可以用于产生任何类型的方法。此外,Lambda 表达式还可以使用 LINQ 查询语句中的延迟求值特性,使代码更加简洁和高效。
# 示例代码
下面是一个使用匿名方法和 Lambda 表达式的完整示例代码:
using System;
delegate void MyDelegate(string name);
class Program
{
    static void Main(string[] args)
    {
        // 使用匿名方法
        MyDelegate myDelegate1 = delegate(string name)
        {
            Console.WriteLine("Hello, " + name);
        };
        DoSomething(myDelegate1);
        // 使用 Lambda 表达式
        MyDelegate myDelegate2 = name => Console.WriteLine("Hello, " + name);
        DoSomething(myDelegate2);
    }
    static void DoSomething(MyDelegate myDelegate)
    {
        myDelegate("John");
    }
}
输出结果:
Hello, John
Hello, John
在上面的示例中,我们首先使用了匿名方法来定义一个委托对象 myDelegate1,然后将其作为参数传递给 DoSomething 方法。接下来,我们使用了 Lambda 表达式来定义另一个委托对象 myDelegate2,并将其作为参数传递给 DoSomething 方法。最终,DoSomething 方法都会输出 Hello, John。
# 总结
匿名方法是一种不具名的方法,可以用于传递给委托或者 Lambda 表达式。在 C# 中,匿名方法可以使用 delegate 关键字或 Lambda 表达式语法来定义。使用匿名方法可以使代码更加简洁和灵活,但需要注意一些区别和限制。
