1

私は現在、私が正しく理解できないいくつかのアイデアについて考えています。

問題は、1つのラムダ関数を使用してキャプチャされた変数をインスタンス化し、別のラムダを使用してその変数のプロパティにアクセスしたいということです。

インスタンス化はラムダ内で行われるため、変数は実際には2番目のラムダ内で使用したい時間にインスタンス化されません。これは一種の鶏が先か卵が先かという問題です。

変数は2番目のラムダで使用されるときにインスタンス化されることは知っていますが、コンパイラーはインスタンス化されません。

私のアイデアがうまくいく方法はありますか?実際のコードは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        SqlCommand cmd;

        using (new DisposableComposite(
            () => cmd = new SqlCommand(),
            () => cmd.Connection)) // <- compiler error - variable not instantiated
        {
            // code
        }
    }
}

class DisposableComposite : IDisposable
{
    private List<IDisposable> _disposables = new List<IDisposable>();

    public DisposableComposite(params Func<IDisposable>[] disposableFuncs)
    {
        // ensure the code is actually executed
        foreach (var func in disposableFuncs)
        {
            IDisposable obj = func.Invoke();
            _disposables.Add(obj);
        }
    }

    public void Dispose()
    {
        foreach (var disposable in _disposables)
        {
            disposable.Dispose();
        }
    }
}
4

3 に答える 3

5

追加するだけですか?

SqlCommand cmd = null;

(これは「明確な割り当て」グリッチを解決します;それ確実に割り当てられます... null; -p次に、使用される前に値を更新します)。

ただし、IMOは、ネストされたusingステートメントを使用した方がよいでしょう...そして実際の接続がどこから来るのか(コードから)は明確ではありません...

using(var conn = new SqlConnection(...))
using(var cmd = conn.CreateCommand()) {
    // ...
}
于 2009-06-10T09:17:09.260 に答える
2

これを回避するには、usingブロックの前にcmdをnullに設定する必要があります。

    SqlCommand cmd=null;

    using (new DisposableComposite(
        () => cmd = new SqlCommand(),
        () => cmd.Connection)) // <- compiler error - variable not instantiated
    {
        // code
    }
于 2009-06-10T09:18:43.080 に答える
0

これは本当に正しくないと感じているというマークに同意します。

もう 1 つのオプションは、新しい Context タイプのオブジェクトを定義することです。これは、Dispose で、それが提供するすべてのオブジェクトを破棄します。

例えば。

using (var ctx = GetContext()) {
   var cmd = ctx.CreateCommand();
   cmd.Connection = ctx.CreateConnection();
}
// cmd is Disposed 
// cmd.Connection is Disposed 
于 2009-06-10T09:22:59.933 に答える