C#Lamda

//添加任意参数的函数
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class EventAndLamda : MonoBehaviour {


    void Start () { 
        //lamda方式可以添加包含任意参数的函数,非常方便
        GetComponent<Button>().onClick.AddListener(()=>{
            //此处其实可以直接写Myfuction(.....),因为是同一个脚本里的函数
            //这样写是为了说明调用其他组件中的函数也是可以的。如果有其他组件的引用,可以直接写:
            //someReference.theMethod(arguments);
            this.GetComponent<EventAndLamda>().MyFunction(10,20.0f,new Vector3(1,1,1));
        });
    }

    public void MyFunction(int i, float f, Vector3 v)
    {
        print (i.ToString()+"\n" + f.ToString() + "\n" + v.ToString());
    }
}
<think>我们正在总结C#中Lambda表达式的介绍。根据之前的引用和讨论,我们可以整理出以下内容: 1. Lambda表达式是C#中一种简洁的匿名函数语法。 2. 它用于创建匿名函数,可以作为参数传递或用于定义委托类型的变量。 3. 基本语法:`(input-parameters) => expression` 或 `(input-parameters) => { sequence-of-statements }`。 4. 左边是输入参数(可省略括号如果只有一个参数),右边是表达式或语句块。 5. 类型推断:编译器根据上下文推断参数类型和返回类型。 6. 应用场景:LINQ查询、事件处理、异步编程等。 7. 与委托的关系:任何Lambda表达式都可以转换为委托类型。 另外,引用中提到的要点: [^1]: 基本语法 [^2]: 表达式lambda和语句lambda [^3]: 输入参数和函数体,以及类型推断 [^4]: Lambda表达式是匿名方法和委托的结合 因此,我们可以组织回答如下: 1. 定义:Lambda表达式是C#中用于创建匿名函数的简洁语法。 2. 语法:分为表达式Lambda和语句Lambda。 3. 类型推断:编译器根据委托类型自动推断参数和返回类型。 4. 应用:在委托使用的地方,如LINQ、事件处理等。 5. 与委托的关系:Lambda表达式可以转换为委托类型。 同时,按照要求,我们需要在引用内容后添加引用标识,并且生成相关问题。 注意:我们不需要重复之前回答中已经详细说明的内容,而是做一个简明扼要的介绍,重点突出核心概念。 生成的相关问题可以围绕Lambda表达式的使用细节、注意事项以及与其他概念的对比。 </think>### C# Lambda 表达式核心解析 Lambda 表达式是 C# 中**基于委托的匿名函数**的简洁语法,核心特征可概括为以下要点: #### 1. **本质与作用** - 将**匿名方法**与**委托**结合,实现函数逻辑的内联定义[^4] - 核心语法:`(参数) => 表达式/语句块`(`=>` 称为 **Lambda 运算符**)[^1] - 主要用途: - 替代传统委托的冗长声明 - 作为参数传递给方法(如 LINQ 的 `Where()`) - 简化事件处理与异步编程 #### 2. **语法形式分类** | 类型 | 语法结构 | 示例 | 特点说明 | |------------------|-----------------------------------|----------------------------------------|------------------------------| | **表达式 Lambda** | `(参数) => 单一表达式` | `x => x * x` | 自动返回表达式结果[^2] | | **语句 Lambda** | `(参数) => { 多行代码 }` | `s => { Console.WriteLine(s); return s.Length; }` | 需显式使用 `return`[^2] | #### 3. **关键技术特性** - **类型推断**: 编译器根据上下文自动推断参数与返回值类型[^3] ```csharp // 推断为 Func<int, bool> var isEven = x => x % 2 == 0; ``` - **参数规则**: - 单参数可省略括号:`s => s.ToUpper()` - 无参数需保留空括号:`() => DateTime.Now` - 显式声明类型:`(int a, string b) => a + b.Length` - **闭包支持**: 可捕获外部作用域变量(形成闭包) ```csharp int base = 10; Func<int, int> adder = x => x + base; // 捕获 base ``` #### 4. **与委托的关系** - Lambda 表达式**编译后生成委托实例**[^4] - 可直接赋值给委托类型变量: ```csharp // 等价于 delegate bool Predicate(int x) Predicate<int> isPositive = x => x > 0; ``` - 替代传统匿名方法(代码量减少 70% 以上): ```csharp // 传统委托 button.Click += delegate(object s, EventArgs e) { MessageBox.Show("Clicked"); }; // Lambda 等效 button.Click += (s, e) => MessageBox.Show("Clicked"); ``` #### 5. **典型应用场景** 1. **LINQ 查询**: ```csharp var adults = people.Where(p => p.Age >= 18); ``` 2. **集合操作**: ```csharp list.ForEach(item => Console.WriteLine(item)); ``` 3. **异步编程**: ```csharp Task.Run(() => { /* 后台执行逻辑 */ }); ``` > **注意**:Lambda 表达式在编译时可能被转换为两种形式: > - **委托实例**:直接执行函数逻辑 > - **表达式树**(`Expression<T>`):生成可分析的代码结构(用于 LINQ to SQL 等场景) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值