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# 语言的发展和一些特定的代码场景仍然是有帮助的。