作为一个长期的C#程序员,我最近来了解有关资源获取即初始化(RAII)的优点的更多信息。特别是,我发现了C#习惯用法:
using (var dbConn = new DbConnection(connStr)) {
// do stuff with dbConn
}
具有C ++等效项:
{
DbConnection dbConn(connStr);
// do stuff with dbConn
}
这意味着记住以包围资源的使用像DbConnection
在一个using
块是在C ++不必要!这似乎是C ++的一大优势。当您考虑一个类的实例成员类型为时,这甚至更令人信服DbConnection
。
class Foo {
DbConnection dbConn;
// ...
}
在C#中,我需要IDisposable
像这样实现Foo :
class Foo : IDisposable {
DbConnection dbConn;
public void Dispose()
{
dbConn.Dispose();
}
}
更糟糕的是,每个用户Foo
都需要记住将其括Foo
在一个using
块中,例如:
using (var foo = new Foo()) {
// do stuff with "foo"
}
现在来看一下C#及其Java根源,我想知道... Java开发人员是否完全欣赏他们放弃堆栈而转而使用堆而放弃RAII时所放弃的一切?
(同样,Stroustrup是否完全理解RAII的重要性?)