有趣的"参考参考"功能,任何解决方法?

Kor*_*tak 12 c# extension-methods reference params

我想知道是否有任何类似的东西可以用于价值类型......

public static class ExtensionMethods {
    public static void SetTo(this Boolean source, params Boolean[] bools) {
        for (int i = 0; i < bools.Length; i++) {
            bools[i] = source;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么这是可能的:

Boolean a = true, b, c = true, d = true, e;
b.SetTo(a, c, d, e);
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为bools是一个值类型,因此它们作为值传递给函数,而不是作为引用.

除了将值类型包装到引用类型中(通过创建另一个类),有没有办法在使用params修饰符时通过引用(ref)将变量传递给函数?

Eri*_*ert 21

这是不可能的.为了解释原因,首先阅读我的文章,了解为什么我们通过将它们放在堆栈上来优化值类型的局部变量的释放:

http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

现在您明白了,应该清楚为什么不能在数组中存储"ref bool".如果可以,那么你可以拥有一个比被引用的堆栈变量更长的数组.我们有两个选择:要么允许这个,要么制作程序,如果你弄错了就会崩溃并死得很厉害 - 这是C的设计师做出的选择.或者,不允许它,并且系统灵活性较低但是更多安全.我们选择后者.

但让我们更深入地思考这个问题.如果你想要的是传递"允许我设置变量的东西",我们就有.那只是一个代表:

static void DoStuff<T>(this T thing, params Action<T>[] actions)
{
    foreach(var action in actions) action(thing);
}
...
bool b = whatever;
b.DoStuff(x=>{q = x;}, x=>{r = x;} );
Run Code Online (Sandbox Code Playgroud)

合理?