C#委托初始化简写咨询:如何直接传递内联委托?
更简洁的内联委托写法
当然有更紧凑的实现方式!你想要直接在方法参数里内联定义委托的需求,C#提供了两种常用的语法来满足,都比先单独定义方法再传递的写法更简洁:
1. 使用匿名方法(C# 2.0及以上支持)
这是早期版本就支持的内联写法,用delegate关键字直接把委托逻辑写在参数位置:
static void Main(String[] args) { DoSomething(delegate(int foo) { int x = foo; }); }
匿名方法不需要给方法单独命名,编译器会自动匹配对应的委托类型,直接完成逻辑的传递。
2. 使用Lambda表达式(C# 3.0及以上支持)
这是现在C#开发中更常用、更简洁的方式,用=>符号连接参数和方法体:
完整明确写法
static void Main(String[] args) { DoSomething((int foo) => { int x = foo; }); }
编译器推断简化写法
因为编译器能根据DoSomething的参数类型(SampleDelegate)自动推断参数类型,所以可以进一步精简:
// 省略参数类型,单个参数还能省略括号 static void Main(String[] args) { DoSomething(foo => { int x = foo; }); }
单行逻辑极致简化
如果你的委托逻辑只有一行代码,还能省略大括号:
static void Main(String[] args) { DoSomething(foo => int x = foo); // 比如如果是打印操作,还能写成:DoSomething(foo => Console.WriteLine(foo)); }
为什么你的写法会报错?
你尝试的void(int foo) { int x = foo; }不是C#的合法语法,C#里没有这种直接在参数位置定义无命名方法的写法,必须通过delegate关键字(匿名方法)或者Lambda表达式的=>语法来实现内联委托。
额外小建议:如果你的SampleDelegate只是接收一个int参数且无返回值,其实可以直接用.NET内置的Action<int>委托类型,这样就不用自己定义SampleDelegate了,代码会更通用。
内容的提问来源于stack exchange,提问作者tobahhh
相关产品推荐
相关产品推荐

