我正在尝试编写一个方法来引用布尔标志并修改它们。布尔值都是单独声明的(即不在可索引的数据结构中),方法的调用者应该能够决定哪些布尔值被修改。
示例代码(有效):
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
到目前为止,一切都很好。现在这些参数在方法上应该是可选的。也就是说,调用者可以选择例如使用setTrue
andinvert
效果,但不能选择使用 the setFalse
one。
基本上,我想做的是:
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?
并不能真正解决我的问题)。我只想让调用者能够将 null作为参考。
虽然该方法的实现可能更复杂,但我真的很想将调用减少到一行。(即避免只为这个调用声明临时变量。)
一种可能性是为函数声明(八个)重载,无论是否给出所有布尔组合,但是我需要提出一些方案来确保它们都具有唯一的签名。(我坚持使用 C# 3.0,所以没有命名参数。)
我错过了什么吗?有干净的解决方法吗?目前,我能想到的唯一(几乎)可接受的替代方法是传入带有变量名(或 null)的字符串,然后使用反射将它们解析为实际字段。
PS:您可能想知道为什么我要尝试做这种奇怪的事情,一些背景的话:该doSomething
方法是库的一部分。的调用doSomething
来自生成的 C# 代码。是的,将所有这些布尔值(在实际项目中约为 200 个)作为单独的字段在大局中确实有意义,但推理与这个问题并不真正相关。