gpt4 book ai didi

c# - 有趣的 "params of ref"功能,有什么解决方法吗?

转载 作者:可可西里 更新时间:2023-11-01 08:18:37 26 4
gpt4 key购买 nike

我想知道对于值类型是否有任何类似的方法......

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

那么这将是可能的:

Boolean a = true, b, c = true, d = true, e;
b.SetTo(a, c, d, e);

当然,这是行不通的,因为 bool 是值类型,所以它们作为值而不是引用传递给函数。

除了将值类型包装成引用类型(通过创建另一个类)之外,还有什么方法可以在使用 params 修饰符时通过引用 (ref) 将变量传递给函数?

最佳答案

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

https://web.archive.org/web/20100224071314/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;} );

有道理吗?

关于c# - 有趣的 "params of ref"功能,有什么解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1776020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com