C#==>匿名方法

1,匿名方法

C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称

匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。

也不能在匿名方法外部使用的ref和out参数

 

2,匿名方法的【λ(拉姆达)表达式】方式定义

 

C#3.0之后匿名方法可以使用λ表达式来进行定义

无论是拉姆达(lambda)表达式(事实上应该叫匿名函数)或是匿名类,都能归属到一种叫闭包的东西上面。

 

λ运算符 =>

左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号

右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加

这是λ表达式的简单实现

string str1 = " 匿名方法外部 ";
string str2 = " 匿名方法内部 ";

MyDelagate my = param => param + str1 + str2;

Console.WriteLine(my(" 参数 "));

 

3,委托调用过程的协变和抗变

关于委托的返回类型和委托方法的参数传递,如果我们不能正确使用的时候,经常会发生“协变和抗变”的错误。

需要额外注意

 

返回类型:返回类型需要注意的是协变

               方法的返回类型可以派生于委托定义的类型。

 

参数类型:参数类型需要注意的是抗变

               向委托传递的参数类型可以派生于委托方法的参数类型

 

返回类型的协变

 

 参数类型的抗变

 

 

 //实际上继承自A的类型B的实例可以转化为A,而子类向父类转化的过程,在默认情况下会有编译错误
//如下代码
A aa = new A();
B bb = new B();
//这句没问题
aa = bb;
//子类向父类转化的过程中存在问题
bb = aa;

 

以上协变和抗变都是由这个原因产生的

 

 

 

 

 

 

 

 

 

 

 

<think>嗯,用户想了解C#中的'=>'符号的用法和含义。首先,我需要确认用户对C#的基础知识是否熟悉,比如是否了解lambda表达式和属性。根据用户的问题,他们可能是在学习过程中遇到了这个符号,需要明确它的不同应用场景。 首先,我应该回忆一下C#中的'=>'符号,它主要用于两种场景:lambda表达式和表达式体定义。在lambda表达式中,'=>'用来分隔输入参数和表达式或语句块。例如,(x) => x * x就是一个简单的lambda表达式,计算平方。而在表达式体定义中,=>可以用于简化方法、属性、构造函数等的定义,比如public int Square(int x) => x * x;。 接下来,我需要检查用户提供的引用内容。引用[1]提到了signed和unsigned修饰符,似乎与当前问题无关。引用[2]提到了C#代码中使用NotNull,这可能涉及到属性或方法的定义,但同样与'=>'符号没有直接联系。因此,这些引用可能对当前问题帮助不大,但需要确保回答时不冲突。 用户可能需要具体的例子来理解不同用法。例如,lambda表达式在LINQ查询中的使用,或者表达式体属性如何简化代码。同时,要注意区分表达式体和语句体的区别,比如当使用语句体时需要用大括号包围。 还需要考虑用户可能的后续问题,比如性能差异、适用场景或常见错误。因此,在回答后生成相关问题,如与委托类型的关系、与匿名方法的区别、性能影响等,可以帮助用户深入理解。 最后,确保回答结构清晰,分点说明,并提供代码示例,这样用户能够逐步理解。同时,使用中文,并遵循LaTeX格式要求,确保数学表达式正确。</think>### C# `=>` 符号的用法详解 C# 中的 `=>` 符号称为 **lambda 运算符**,主要用于两种场景:**Lambda 表达式**和**表达式体定义**。以下是具体用法和示例: --- #### 一、Lambda 表达式 Lambda 表达式是匿名函数的简写形式,常用于委托或 LINQ 查询。语法为:`(输入参数) => 表达式` **示例:** ```csharp // 1. 计算平方 Func<int, int> square = x => x * x; Console.WriteLine(square(5)); // 输出 25 // 2. 筛选偶数(LINQ) var numbers = new List<int> {1, 2, 3, 4}; var evenNumbers = numbers.Where(n => n % 2 == 0); // 结果: 2, 4 // 3. 多参数 Func<int, int, int> add = (a, b) => a + b; Console.WriteLine(add(3, 7)); // 输出 10 ``` **说明:** - 单参数时可省略括号:`x => x * x` - 多参数必须使用括号:`(a, b) => a + b` - 若需执行多条语句,使用 `{ }` 包裹代码块: ```csharp Action<string> log = message => { Console.WriteLine($"[LOG] {DateTime.Now}: {message}"); }; ``` --- #### 二、表达式体定义 `=>` 可用于简化方法、属性、构造函数等的定义,替代传统的大括号语法。 **示例:** ```csharp // 1. 方法简化 public int Double(int x) => x * 2; // 2. 只读属性 public string FullName => $"{FirstName} {LastName}"; // 3. 构造函数初始化 public class Person { public string Name { get; } public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name)); } // 4. 属性验证(结合 Null 检查) public string UserName { get => _userName; set => _userName = value ?? throw new ArgumentNullException(nameof(value)); } ``` **关键区别:** - **表达式体**:单行代码,直接返回值(无需 `return`) - **语句体**:多行代码,需用 `{ }` 包裹并使用 `return` --- #### 三、注意事项 1. **类型推断**:Lambda 表达式参数类型通常由编译器自动推断。 2. **委托兼容性**:Lambda 表达式必须与目标委托类型匹配,例如: ```csharp Func<int, bool> isEven = x => x % 2 == 0; // 匹配 Func<int, bool> 委托 ``` 3. **捕获变量**:Lambda 可以访问外部作用域的变量(称为“闭包”),但需注意生命周期问题[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值