网站首页 > 文章精选 正文
C# 中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于 C# 匿名方法的一些重要特点和用法:
特点
省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法可转换为具有多种签名的委托,而 Lambda 表达式无法做到这一点。
外部变量访问:匿名方法可以访问其外部范围的变量,但有一些限制。创建委托时,对外部变量的引用被视为已捕获,已捕获的变量的生存期一直延伸至引用匿名方法的委托具有垃圾回收资格为止。不过,匿名方法无法访问外部范围的in、ref或out参数。
代码块传递:匿名方法实际上是将代码块作为委托参数进行传递,这样可以减少对委托进行实例化的编码开销,在一些特定情况下,如避免创建不必要的单独方法时很有用处。
跳转语句限制:匿名方法的参数范围为匿名方法块。如果跳转目标在匿名方法块之外,匿名方法块内使用goto、break或continue等跳转语句是错误的;反之,如果目标在匿名方法块之内,匿名方法块外使用这些跳转语句也是错误的。
其他限制:匿名方法内无法访问任何不安全代码,也不允许在is运算符左侧使用匿名方法。
示例用法
class Program
{
static void Main(string[] args)
{
// 使用匿名方法作为事件处理程序
System.Windows.Forms.Button button1 = new System.Windows.Forms.Button();
button1.Click += delegate (System.Object o, System.EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Click!");
};
// 使用匿名方法创建委托
delegate void Del(int x);
Del d = delegate (int k)
{
// 匿名方法的代码块
};
// 在集合操作中使用匿名方法
List<string> names = new List<string>();
names.Add("Sunny Chen");
names.Add("Kitty Wang");
names.Add("Sunny Crystal");
List<string> found = names.FindAll(delegate (string name)
{
return name.StartsWith("sunny", StringComparison.OrdinalIgnoreCase);
});
if (found!= null)
{
foreach (string str in found)
{
Console.WriteLine(str);
}
}
}
}
在上述代码中,展示了匿名方法的多种用法,包括作为按钮的点击事件处理程序、创建委托实例以及在集合的FindAll方法中使用匿名方法来筛选符合条件的元素。
尽管匿名方法在某些情况下很有用,但在 C# 3.0 及更高版本中,Lambda 表达式通常是编写内联代码的首选方式,因为它更简洁、更具可读性。不过,了解匿名方法对于理解 C# 语言的发展和一些特定的代码场景仍然是有帮助的。
猜你喜欢
- 2025-07-17 C#学习随笔—自定义控件(面板)(c#自定义控件三个步骤)
- 2025-07-17 C#基础:ref 参数(c#中rectangle)
- 2025-07-17 C# 值类型和引用类型讲解(c#引用类型分为四类)
- 2025-07-17 C#指针的应用(c#指针操作)
- 2025-07-17 C#.NET in、out、ref详解(c# inotify)
- 2025-07-17 C#数组(C#数组排序)
- 2025-07-17 可视化仪表盘控件再更新:增强数据可视化、Winforms功能
- 2025-07-17 C#实战036:各种泛型的定义和使用详解
- 2025-07-17 C#中的9个“黑魔法”与“骚操作”
- 2025-07-17 什么是C#标识符,如何定义?什么是C#保留字?都有哪些保留字?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)