捕获变量实例化问题

我正在思考一些我无法做对的想法。 问题是我想使用一个lambda函数来实例化捕获的变量,并使用另一个lambda来访问该变量的属性。 由于实例化发生在lambda中,变量实际上并没有实例化我想在第二个lambda中使用它的时间..这是一种鸡和蛋的问题。 我知道变量将在第二个lambda中使用时被实例化,但编译器没有。 我的想法有什么办法可行吗?这是实际的代码:
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();
        }
    }
}
    
已邀请:
你的意思是只是添加:
SqlCommand cmd = null;
(它解决了“明确赋值”故障;它被明确赋值...一个空;-p然后我们在使用之前更新该值)。 但是,IMO对嵌套的
using
语句做得更好......并且(从代码中)不清楚实际连接将来自哪里......
using(var conn = new SqlConnection(...))
using(var cmd = conn.CreateCommand()) {
    // ...
}
    
您只能通过在使用块之前将cmd设置为null来避免这种情况:
    SqlCommand cmd=null;

    using (new DisposableComposite(
        () => cmd = new SqlCommand(),
        () => cmd.Connection)) // <- compiler error - variable not instantiated
    {
        // code
    }
    
同意Marc认为这不太合适。 另一种选择是定义一个新的Context类型对象,在Dispose上处理它提供的所有对象。 例如。
using (var ctx = GetContext()) {
   var cmd = ctx.CreateCommand();
   cmd.Connection = ctx.CreateConnection();
}
// cmd is Disposed 
// cmd.Connection is Disposed 
    

要回复问题请先登录注册