最近偶正在关注 C++/CLI ,经常听人在介绍 自动确定性资源回收(Automatic deterministic destruction) 特性的时候,宣称 C# 的 using statement 不能在一行中初始化多个变量,进而说明 C++/CLI 的这一设计多么优秀。虽然后果不是很严重,偶也不是很生气,但是为了开始在 cnblogs 的第一篇文章,我决心要为 C# using statement 平反昭雪!
起因:有人认为如果在同一个作用域中需要使用很多包含非托管资源的对象,C# 就一定要使用嵌套的 using statement。
using( A a = new A(...) )
{
using( B b = new B(...) )
{
using( C c = new c(...) )
{
... ...
}
}
}
而 C++/CLI 只要这样写:
A a(...);
B b(...);
C c(...);
经过:偶认为 C++/CLI 的语法在这一点上固然简洁到了家。不过 C# 的写法也不见得一定要这么丑陋。既然大家都实现了IDisposable。我们何必嵌套那么多层呢
:
using( IDisposable a = new A(...), b = new B(...), c = new C(...) )
{
(a as A) ... ...
(b as B) ... ...
(c as C) ... ...
}
结果:虽然表面上的写法有那么一些差别,但是编译成 MSIL 之后,无论是C# using statement、还是 C++/CLI 自动确定性资源回收 甚至 是你自己写的嵌套 try / finally 块,生成的代码都是相差无几的。统统都是 .Try / Finally (Fault) 块的嵌套。所以偶感觉 C++/CLI 的这项特性基本只是个语法层面的小hack,没有什么好拿来当卖点的样子。IMHO,STL.net 才更像是值得人们期待的东东。