含Action委托的C#代码为何能无问题执行?请解析原因
这段C#代码的执行逻辑与无报错原因解析
嘿,我来帮你拆解这段代码的运行逻辑,还有它看起来带了个网址却能正常执行的奥秘~
一、先理清执行逻辑
首先咱们把代码里的“干扰项”去掉,还原成编译器实际识别的版本:
static void Main(string[] args) { // 第一步:创建一个Action委托,绑定到名为add的方法 Action<int, int> ActionDelegate = new Action<int, int>(add); // 第二步:调用委托,本质就是执行add(130, 45) ActionDelegate.Invoke(130, 45); } // 注意:这段代码必须存在(用户没写但实际要有) static void add(int num1, int num2) { // 比如做加法输出或者其他操作,比如 Console.WriteLine(num1 + num2); }
执行流程很直白:
- 程序启动进入
Main方法,先实例化一个Action<int, int>类型的委托,把它和add方法绑定在一起——Action<int,int>本身就是C#预定义的委托类型,专门用来指向“无返回值、接受两个int参数”的方法; - 调用委托的
Invoke方法传入130和45,这就相当于直接调用add(130,45),触发方法执行。
二、为什么带网址的代码不会报错?
你肯定注意到代码里混了http://csharpstar.com,这其实是个“巧合”的语法组合:
- 首先
http:是C#里合法的标签(Label)——标签原本是给goto语句用的跳转标记,语法就是「标识符+冒号」,http是合法的标识符,所以http:完全符合语法,哪怕你没用到goto跳转它,编译器也不会找你麻烦; - 紧接着的
//csharpstar.com是单行注释——C#里只要碰到//,后面的所有内容都会被编译器直接忽略,不会参与编译。
所以在编译器眼里,那一行代码其实是分成了两部分:
Action<int, int> ActionDelegate = new Action<int, int>(add); http: //csharpstar.com
一个正常的委托赋值语句,加上一个没用但合法的标签,再加上一段被忽略的注释——自然不会报错。
最后还有个隐藏前提:你的代码所在的类里必须有一个add方法,它的签名得完全匹配Action<int,int>的要求——也就是返回值是void,参数是两个int。要是这个方法不存在,代码才会报错,否则就能顺利编译执行啦。
内容的提问来源于stack exchange,提问作者Thangamani Palanisamy
相关产品推荐
相关产品推荐

