如何捕获变量?
或者,我可以存储对象引用的引用吗?
通常,方法可以使用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();
}
......但也许有更好的主意。
答案 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参数)。