如何捕获变量(C#)

时间:2009-08-17 13:33:24

标签: c# .net argument-passing

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

通常,方法可以使用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();
}

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

3 个答案:

答案 0 :(得分:2)

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

lambda或代表可能是你最好的选择。我想你可以使用事件,观察者界面等等。

答案 1 :(得分:1)

使用带有1个元素的数组

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

你也可以使用包装“int?” - 原谅他们可以自由,但请记住,它总是通过参考。

答案 2 :(得分:0)

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

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构造函数将一个委托作为其参数,并在Bar类中构造委托(并传递委托而不是传递ref参数)。