2009-08-17 78 views
0

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

通常情况下,一种方法可以使用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

您的解决方案对我来说似乎很不错... – 2009-08-17 13:38:58

回答

1

使用磁盘阵列和1元

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

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

+0

不,不是。可空是一个结构 – 2009-08-17 14:52:11

+0

是的,原谅空号!但阵列仍然是很好的参考持有者。 – Dewfy 2009-08-17 15:29:38

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); 
    } 
} 

如果上述方法无效,那么说这个招聘构造函数采用委托作为其参数,在Bar类中构造委托(并传递委托,而不是传递ref参数)。

+0

错误:无法在匿名方法,lambda表达式或查询表达式中使用ref或out参数'x' – 2009-08-17 13:55:47

+0

是的,不起作用。 – 2009-08-17 13:58:08