C#中栈上using声明的IDisposable结构体是否按序释放?
C#中using声明结构体的RAII语义与释放顺序
是的,C#在你描述的场景下具备可靠的类RAII语义,你的代码会保证输出序列:
1 2 3 4 5
具体规则和解释如下:
- 对于用
using var声明的局部值类型结构体(未被复制到其他位置),C#语言规范明确规定:这类变量会在所在作用域结束时,按声明的逆序调用Dispose方法。 - 对应你的代码执行流程:
Main方法先执行Console.WriteLine("1"),输出1- 调用
func方法后,先实例化x4,再实例化x3 func内执行Console.WriteLine("2"),输出2func方法的作用域结束,先释放x3(调用其Dispose方法输出3),再释放x4(调用其Dispose方法输出4)- 回到
Main方法执行Console.WriteLine("5"),输出5
只要结构体是局部声明且未被复制(比如未作为参数传递、未赋值给其他变量),这种释放顺序就是语言层面保证的,完全符合RAII的可靠语义。
内容的提问来源于stack exchange,提问作者Walter Svenddal
相关产品推荐
相关产品推荐

