C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字

  • 匿名方法

    • C# 匿名方法定义

      C# 中的匿名方法是没有名称的方法,‌它在声明和初始化时就被使用。‌通常与委托(‌delegate)‌一起使用,‌以便将代码块作为参数传递给其他方法。‌匿名方法可以转换为System.Action 和 System.Func 等类型,同时指定自定义的参数列表。匿名方法通常表现为使用delegate运算符Lambda表达式‌

    • 定义方式‌:‌

      • 使用 delegate 关键字声明委托类型。‌            
        • MyDelegate m = delegate(string x) { Console.WriteLine("匿名方法: {0}", x); }
      • 在需要委托实例的地方,‌直接定义匿名方法并赋值。
        • MyDelegate m = x => Console.WriteLine("匿名方法: {0}", x);
    • 使用场景
      • 临时需要小段逻辑,‌但不想单独定义一个完整的方法。‌
      • 作为事件处理器或回调方法。‌
      • 在需要委托类型但不想显式定义方法时。‌
    • 缺点

      • 可读性差‌:‌由于匿名方法没有具体的名称,‌当代码量较大时,‌可能会降低代码的可读性,‌使得其他开发者难以理解和维护。‌
      • 难以重用‌:‌匿名方法通常只在其定义的作用域内有效,‌无法在其他地方重用,‌这可能导致代码冗余,‌特别是在需要多次执行相同逻辑时。‌
      • 调试困难‌:‌在调试过程中,‌由于匿名方法没有名称,‌可能难以在调试器中直接定位到具体的匿名方法实现,‌增加了调试的难度。‌
      • 这些缺点使得匿名方法在某些情况下可能不是最佳选择,‌特别是在需要高可读性和可重用性的项目中。‌

    • 本质

      • C#匿名方法的本质是委托

  • lambda表达式

    • C# Lambda表达式定义

      Lambda 表达式的本质也是匿名方法。Lambda 表达式提供了一种简洁和富有表现力的方式来创建匿名函数,可以使用 => 运算符来构造 Lambda 表达式。

    • 定义方式

      • (input-parameters) => { }

        •  参数列表​​​​​​​(input-parameters) ‌:‌

          •    可包含零个或多个参数。‌
          • 参数类型可隐式或显式定义   
        • Lambda运算符‌:‌
          •  使用=>符号分隔参数列表和表达式/语句块。‌
        • 表达式/语句块‌:‌

          •  表达式:‌单个表达式,‌计算结果作为Lambda的返回值。‌
          •  语句块:‌包含在大括号{}中的一系列语句,‌可执行复杂逻辑,‌最后一个语句的结果作为返回值(‌若适用)。
    • 使用场景‌:‌

      •  常用于LINQ查询,‌提供简洁的数据查询和处理语法。‌
      •  用于事件处理,‌可以简化事件处理方法的编写。‌
      •  便于创建委托实例,‌特别是在需要传递简单函数作为参数时。‌
    •  C# Lambda样例
      •  基本Lambda表达式
        • ​​​​​​​ 无参数‌:‌() => Console.WriteLine("Hello, World!");
        • 单参数‌:‌ x => x * x
        • 多参数‌:‌(x, y) => x + y
        • 带语句块的Lambda     x => { int result = x * x; return result; }
      • Lambda表达式应用
        • ‌  LINQ查询‌:‌list.FindAll(x => x > 5);
        •  事件处理‌:‌button.Click += (s, e) => { /* 事件处理逻辑 */ };
  • Action

    •  Action的定义 

       ​​​​​​​ Action 是 C# 中的一个委托类型,‌表示没有返回值和参数的方法。‌它用于封装方法,‌以便可以将其作为参数传递、‌赋值给其他委托等。‌

       Action其实就是没有返回值的delegate

    • 创建方式 
      • ​​​​​​​直接实例化‌:‌
        •    通过指定方法来创建Action实例。‌
        • 示例:‌Action action = MyMethod;   
      • ​​​​​​​使用匿名方法‌:‌
        •    无需定义独立方法,‌直接在Action实例化时定义方法体。‌
        • 示例:‌Action action = () => { /* 方法体 */ };   
      • Lambda表达式‌:‌
        •    简洁方式,‌适用于简短逻辑或表达式。‌
        • 示例:‌Action action = () => Console.WriteLine("Hello, World!");   
      • 带参数的Action‌:‌
        •    创建带参数的Action,‌通过泛型指定参数类型。‌
        • 示例:‌Action action = x => Console.WriteLine(x);  
    • 原理
      • ​​​​​​​委托揭秘 - Old - 博客园 (cnblogs.com)

         委托和匿名方法不能混淆。C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。

       委托是方法的类型安全的引用,之所以说委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。

 

      匿名方法是C#2.0引入的一个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate)。

      当我们需要一个函数,但又懒得去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。   

              

你可能感兴趣的:(基础巩固,c#,开发语言,.netcore)