IDisposableにキャストする理由Dispose()?Dispose()を呼び出す前にIDisposableにキャスト
public interface ITransaction : IDisposable
{}
.
.
.
//in some other class:
public void EndTransaction(ITransaction transaction)
{
if (transaction != null)
{
(transaction as IDisposable).Dispose();
// is the following code wrong? transaction.Dispose()
transaction = null;
}
}
これはITransactionの具体的な実装の一つである:
public class NHibernateTransaction : ITransaction
{
public NHibernateTransaction(NHibernate.ITransaction transaction)
{
this.Transaction = transaction;
}
protected NHibernate.ITransaction Transaction { get; private set; }
public void Dispose()
{
if (this.Transaction != null)
{
(this.Transaction as IDisposable).Dispose(); // this is NHibernate ITransaction object
this.Transaction = null;
}
}
}私はリポジトリパターンのオープンソース実装でそのコードスニペットを何度も見てきました
と私が見えることはできませんキャストの背後にある理由を理解する。直接transaction.Dispose()の場合は、をうまく動作させる必要があります。私は何か見落としてますか?
元のコードはここで見つけることができる: NHibernateTransaction.cs
これは間違っています。 nullを割り当てることも間違っています。そうでなければ誤動作することはありません。誰もが本当に.NETをよく理解していないと書いています。 –
これはあなたの答えです。http://stackoverflow.com/questions/4695649/cast-type-to-idisposable-why –
@ハンス:どちらも_不必要です。あなたはそれを間違ったスタイルと呼ぶことができますが、実際には有害ではありません。しかし、「.NETを本当に理解していない」と合意しました。 –