gpt4 book ai didi

c# - C# 中可选 ref 参数的解决方法

转载 作者:太空狗 更新时间:2023-10-29 20:03:37 27 4
gpt4 key购买 nike

我正在尝试编写一种方法,该方法采用对 bool 标志的引用并修改它们。 bool 值全部单独声明(即不在可索引数据结构中),方法的调用者应该能够决定要修改哪些 bool 值。

示例代码(有效):

class Program
{
private static bool b1, b2, b3, b4, b5;

private static void doSomething(ref bool setTrue, ref bool setFalse, ref bool invert)
{
setTrue = true;
setFalse = false;
invert = !invert;
}

static void Main(string[] args)
{
Console.WriteLine("Pre: {0}, {1}, {2}, {3}, {4}", b1, b2, b3, b4, b5);
doSomething(ref b1, ref b3, ref b5);
Console.WriteLine("Post: {0}, {1}, {2}, {3}, {4}", b1, b2, b3, b4, b5);
}
}

输出,如预期:

Pre: False, False, False, False, False
Post: True, False, False, False, True

到目前为止,还不错。现在这些参数在方法上应该是可选的。也就是说,调用者可以选择例如使用 setTrueinvert 效果,但不要使用 setFalse 效果。

基本上,我想做的是:

doSomething(ref b1, null, ref b5); // error CS1503: Argument 2: cannot convert from '<null>' to 'ref bool'

然后像这样声明 doSomething 方法:

private static void doSomething(ref bool setTrue, ref bool setFalse, ref bool invert)
{
if(setTrue != null) setTrue = true;
if(setFalse != null) setFalse = false;
if(invert != null) invert = !invert;
}

请注意,我不想检查值是否为空。这些值是真正的 bool 值,不能为空(将它们声明为 bool? 并不能真正解决我的问题)。我只想让调用者能够给 null 作为引用

虽然该方法的实现可能更复杂,但我真的很想将调用简化为一行。 (即避免只为此调用声明临时变量。)

一种可能性是为函数声明(八个)重载,无论是否给定 bool 值的所有组合,但我需要想出一些方案来确保它们都有唯一的签名。 (我坚持使用 C# 3.0,所以没有命名参数。)

我错过了什么吗?有干净的解决方法吗?目前我能想到的唯一(勉强)可以接受的替代方法是传入带有变量名(或 null)的字符串,然后使用反射将它们解析为实际字段。

PS:您可能想知道为什么我要尝试做这么奇怪的事情,一些背景的话:doSomething 方法是库的一部分。 doSomething 的调用来自生成的 C# 代码。是的,将所有这些 bool 值(实际项目中约 200 个)作为单独的字段确实在大局中有意义,但推理与这个问题并不真正相关。

最佳答案

如果您真的想要有可选参数,您唯一的解决方案是使用指针,因为它们可以为 null,这与 ref 不同。

private static unsafe void doSomething(bool* setTrue, bool* setFalse, bool* invert)
{
if (setTrue != null) *setTrue = true;
if (setFalse != null) *setFalse = false;
if (invert != null) *invert = !*invert;
}

丑陋无处不在。但是,嘿,可选参数!

关于c# - C# 中可选 ref 参数的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6249726/

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