長年のC#プログラマーとして、最近、Resource Acquisition Is Initialization(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#では、Foo IDisposable
を次のように実装する必要があります。
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の重要性を完全に評価しましたか?)