using代码块内return后,外部throw语句是否可达?
这段C#代码中的throw语句是否可达?
首先明确结论:这段throw语句逻辑上完全不可达,但编译器没有标记它为不可达代码,原因和异步方法的编译特性有关。
具体分析:
- 从代码执行流来看,
using块内部已经有return qry;语句,当await完成后,方法会直接返回结果,using块执行完毕后,后续的throw语句根本没有机会被执行。 - 但异步方法的编译逻辑和普通同步方法不同:编译器会将异步方法转换为基于状态机的结构(依赖
AsyncTaskMethodBuilder实现)。在这种转换过程中,编译器的静态代码分析不会像同步方法那样严格判定using块后的代码不可达,因此不会给出不可达代码的警告或错误。 - 实际运行时,这段
throw永远不会被触发,因为方法在return时就已经完成了Task的返回,后续代码不会进入执行流程。
内容的提问来源于stack exchange,提问作者Chris Hayes
相关产品推荐
相关产品推荐

