【问题标题】:How Do I capture a variable (C#)如何捕获变量 (C#)
【发布时间】:2009-08-17 13:33:23
【问题描述】:

如何捕获变量?
或者,我可以存储对对象引用的引用吗?

通常,方法可以使用 ref 关键字更改其外部的变量。

void Foo(ref int x)
{
    x = 5;
}

void Bar()
{
    int m = 0;
    Foo(ref m);
}

这是清晰而直接的。

现在让我们考虑一个类来实现同样的事情:

class Job
{
    // ref int _VarOutsideOfClass; // ?????

    public void Execute()
    {
        // _VarOutsideOfClass = 5; // ?????
    }
}

void Bar()
{
    int m = 0;
    var job = new Job()
    {
        _VarOutsideOfClass = ref m    // How ?
    };
    job.Execute();
}

如何正确书写?


评论:我不能让它成为一个带有ref 参数的方法,因为通常Execute() 会在稍后出现在队列中时在不同的线程中调用。

目前,我制作了一个包含大量 lambda 的原型:

class Job
{
    public Func<int> InParameter;
    public Action<int> OnResult;

    public void Execute()
    {
        int x = InParameter();
        OnResult(5);
    }
}

void Bar()
{
    int m = 0;
    var job = new Job()
    {
        InParameter = () => m,
        OnResult = (res) => m = res
    };
    job.Execute();
}

...但也许有更好的主意。

【问题讨论】:

  • 您的解决方案对我来说似乎很不错...

标签: c# .net argument-passing


【解决方案1】:

你不能有一个 ref 字段。例如,请参阅http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx(向下滚动到“这解释了为什么您不能创建“ref int”字段......”的位置)。

lambda 或委托可能是您最好的选择。我想你可以使用一个事件,或者一个观察者接口,或者其他东西。

【讨论】:

    【解决方案2】:

    使用 1 个元素的数组

    class Job{
    int[] _VarOutsideOfClass = new int[1];
    

    您也可以使用包装器“int?” - 原谅它们可以为空,但请记住它总是通过引用。

    【讨论】:

    • 是的,原谅 Nullable!但是数组仍然是很好的参考持有者。
    【解决方案3】:

    这是一个猜测(我还没有尝试/测试过):

    class Job
    {
      Action<int> m_delegate;
    
      public Job(ref int x)
      {
        m_delegate = delegate(int newValue)
        {
          x = newValue;
        };
      }
    
      public void Execute()
      {
        //set the passed-in varaible to 5, via the anonymous delegate
        m_delegate(5);
      }
    }
    

    如果上面的方法不行,那么说Job构造函数接受一个delegate作为它的参数,在Bar类里面构造这个delegate(并且传递delegate而不是传递ref参数)。

    【讨论】:

    • 错误:不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“x”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多