【发布时间】:2011-09-09 03:13:30
【问题描述】:
我正在尝试编写一个方法来引用布尔标志并修改它们。布尔值都是单独声明的(即不在可索引的数据结构中),并且方法的调用者应该能够决定要修改哪些布尔值。
示例代码(可行):
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 和invert 效果,但不要使用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? 并不能真正解决我的问题)。我只想让调用者能够将 null 作为参考。
虽然方法的实现可能更复杂,但我真的希望将调用减少到一行。 (即避免只为这个调用声明临时变量。)
一种可能性是为函数声明(八)个重载,无论是否给出所有布尔组合,但我需要提出一些方案来确保它们都有唯一的签名。 (我坚持使用 C# 3.0,所以没有命名参数。)
我错过了什么吗?有干净的解决方法吗?目前,我能想到的唯一(几乎)可接受的替代方法是传入带有变量名(或 null)的字符串,然后使用反射将它们解析为实际字段。
PS:您可能想知道为什么我要尝试做这种奇怪的事情,一些背景的话:doSomething 方法是库的一部分。 doSomething 的调用来自生成的 C# 代码。是的,将所有这些布尔值(在实际项目中约为 200 个)作为单独的字段确实在大局中有意义,但推理与这个问题并不真正相关。
【问题讨论】:
-
@BoltClock 是的,谢谢。我总是把这些版本号混在一起。我在问题中修复了它。
-
上帝,感谢您提供的所有出色答案。 :) 我没想到有人会关心由非常不常见的要求引起的我公认的非常奇怪的问题。 :)
标签: c# c#-3.0 optional-parameters ref