代码之家  ›  专栏  ›  技术社区  ›  jeff17237

匿名操作中的已关闭局部变量与预期不符

  •  2
  • jeff17237  · 技术社区  · 7 年前

    我现在有下面的代码,我想打匿名电话 Action<> 用一个闭包捕获一个局部变量。

    编辑:原始问题(简化,但实用)

    public class B
    {
        void MyMethod(A instanceA)
        {
            var someRefType = new RefType();
            someRefType.DoSomething();
            someRefType.DoSomethingLater(a => instanceA.ModifyRefType(someRefType));
        }
    }
    
    public class A
    {
        private Action<object> _action;
    
        public void ModifyRefType(Action<object> action)
        {
            this._action = action;
        }
    
        public void DoModify(object configuration)
        {
            this._action?.Invoke(configuration);
        }
    }
    

    在我的理解中,闭包应该捕获局部变量,以便每次调用 MyMethod() 将在的另一个实例上关闭 someRefType . 但是,当我打电话的时候 MyMulk() 多次打匿名电话 Action 提供在 DoSomethingLater() ,所有呼叫 ModifyRefType() 使用同一实例(在上次调用中创建的实例 MyMulk() )

    我这里缺什么?最好的方法是什么 躯体类型 这样每个动作都是正确的例子?

    编辑:正如@dasbinklenlight和@ericlippert怀疑的那样,这不是关闭的问题。 躯体类型 . 这个问题正在接近尾声(在这个可怕的例子中) this . 我已经相应地更新了代码。

    1 回复  |  直到 7 年前
        1
  •  0
  •   jeff17237    7 年前

    正如上面的评论所解释的,这最终不是一个封闭范围的问题。下面是一些带有“解决方案”的简化代码。

    public class B
    {
        void MyMethod()
        {
            var instanceA = new A();
            var someRefType = new RefType();
            someRefType.DoSomething();
            someRefType.DoSomethingLater(a => instanceA.ModifyRefType(someRefType));
        }
    }
    
    public class A
    {
        private Action<object> _action;
    
        public void ModifyRefType(Action<object> action)
        {
            this._action = action;
        }
    
        public void DoModify(object configuration)
        {
            this._action?.Invoke(configuration);
        }
    }
    

    总结:相同 instanceA 被(不小心)用于 instanceA.ModifyRefType() 这意味着这个行动使用的是相同的结束语,它围绕着 someRefType 英典 .

    谢谢你的帮助!

    推荐文章