如何捕获变量(C#)

如何捕获变量(C#),c#,.net,argument-passing,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()

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

通常,方法可以使用
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();
}
课堂作业
{
公共函数参数;
对结果的公共行动;
public void Execute()
{
int x=InParameter();
结果(5);
}
}
空条()
{
int m=0;
var job=新作业()
{
InParameter=()=>m,
OnResult=(res)=>m=res
};
job.Execute();
}

。。。但是也许有一个更好的主意。

使用带有1个元素的数组

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

您也可以使用包装器“int?”——请原谅它们可以为null,但请记住它总是传递给引用

使用带有1个元素的数组

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

您也可以使用包装器“int?”——请原谅它们可以为null,但请记住它总是传递给引用

不能有ref字段。例如,请参见(向下滚动至显示“这解释了为什么无法创建“ref int”字段…”的位置)


lambda或代表可能是您在这里的最佳选择。我想您可以使用事件、观察者界面或其他东西。

您不能使用ref字段。例如,请参见(向下滚动至显示“这解释了为什么无法创建“ref int”字段…”的位置)

lambda或代表可能是您在这里的最佳选择。我想您可以使用事件、观察者界面或其他东西。

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

课堂作业
{
行动小组代表;
公共职务(参考int x)
{
m_delegate=委托(int newValue)
{
x=新值;
};
}
public void Execute()
{
//通过匿名委托将传入变量设置为5
m_代表(5);
}
}

如果上述方法不起作用,那么假设作业构造函数将委托作为其参数,并在Bar类中构造委托(并传递委托而不是传递ref参数)。

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

课堂作业
{
行动小组代表;
公共职务(参考int x)
{
m_delegate=委托(int newValue)
{
x=新值;
};
}
public void Execute()
{
//通过匿名委托将传入变量设置为5
m_代表(5);
}
}


如果上述方法不起作用,那么假设作业构造函数将委托作为其参数,并在Bar类中构造委托(并传递委托而不是传递ref参数).

您的解决方案对我来说非常好…您的解决方案对我来说非常好…错误:无法在匿名方法、lambda表达式或查询表达式中使用ref或out参数“x”。错误:无法在匿名方法、lambda表达式或查询表达式中使用ref或out参数“x”。请原谅,可以为null!但数组仍然是很好的引用持有者。是的,请原谅可以为null!但数组仍然是很好的引用持有者。