ブール値フラグへの参照を取得して変更するメソッドを作成しようとしています。ブール値はすべて個別に宣言され (つまり、インデックス可能なデータ構造ではありません)、メソッドの呼び出し元は、どのブール値が変更されているかを判断できる必要があります。
サンプルコード (これは機能します):
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
効果を使用することを選択できますが、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;
}
値が null かどうかを確認したくないことに注意してください。値は実際のブール値であり、null にすることはできません (そして、それらを宣言してbool?
も実際には問題は解決しません)。呼び出し元に参照としてnull を与える機能を与えたいだけです。
メソッドの実装はもっと複雑かもしれませんが、呼び出しを 1 行に抑えたいと思います。(つまり、この呼び出しのためだけに一時変数を宣言する必要がなくなります。)
1 つの可能性は、bool のすべての組み合わせが指定されているかどうかにかかわらず、関数の (8 つの) オーバーロードを宣言することですが、その場合、それらすべてに一意のシグネチャがあることを確認するためのスキームを考え出す必要があります。(私は C# 3.0 に固執しているため、名前付きパラメーターはありません。)
何か不足していますか?クリーンな回避策はありますか?現在、私が考えることができる唯一の(かろうじて)受け入れられる代替手段は、変数名(またはnull)を含む文字列を渡し、リフレクションを使用してこれらを実際のフィールドに解決することです。
PS: なぜ私がこんな奇妙なことをしようとしているのか疑問に思っているかもしれませんが、背景の言葉:doSomething
メソッドはライブラリの一部です。の呼び出しはdoSomething
、生成された C# コードからのものです。はい、これらすべての bool (実際のプロジェクトでは ~200) を個別のフィールドとして持つことは、全体像では理にかなっていますが、その理由はこの質問にはあまり関係ありません。