質問
C# には 2 つの奇妙な演算子があります。
これを正しく理解していれば、これらの演算子は、ブール式の代わりに使用したい型や、ブール型への暗黙的な変換を提供したくない型で使用できます。
次のクラスがあるとします。
public class MyType
{
public readonly int Value;
public MyType(int value)
{
Value = value;
}
public static bool operator true (MyType mt)
{
return mt.Value > 0;
}
public static bool operator false (MyType mt)
{
return mt.Value < 0;
}
}
したがって、次のコードを書くことができます。
MyType mTrue = new MyType(100);
MyType mFalse = new MyType(-100);
MyType mDontKnow = new MyType(0);
if (mTrue)
{
// Do something.
}
while (mFalse)
{
// Do something else.
}
do
{
// Another code comes here.
} while (mDontKnow)
ただし、上記のすべての例では、true 演算子のみが実行されます。では、C# の false 演算子は何に役立つのでしょうか?
解決
これを使用してオーバーライドできます。 &&
そして ||
オペレーター。
の &&
そして ||
演算子はオーバーライドできませんが、オーバーライドすると |
, &
, true
そして false
コンパイラが呼び出す正確な方法で |
そして &
書くとき ||
そして &&
.
たとえば、このコードを見てください ( http://ayende.com/blog/1574/nhibernate-criteria-api-operator-overloading - このトリックをどこで知りましたか; アーカイブ版 @BiggsTRC による):
public static AbstractCriterion operator &(AbstractCriterion lhs, AbstractCriterion rhs)
{
return new AndExpression(lhs, rhs);
}
public static AbstractCriterion operator |(AbstractCriterion lhs, AbstractCriterion rhs)
{
return new OrExpression(lhs, rhs);
}
public static bool operator false(AbstractCriterion criteria)
{
return false;
}
public static bool operator true(AbstractCriterion criteria)
{
return false;
}
これは明らかに副作用であり、本来の使用方法ではありませんが、便利です。
他のヒント
Shog9 と Nir:ご回答ありがとうございます。それらの答えが私に教えてくれたのは、 スティーブ・アイチャートの記事 そしてそれは私に指摘しました msdn:
操作 x && y は T.false(x) ? として評価されます。バツ :T.&(x, y)。ここで、T.false(x) は T で宣言された演算子 false の呼び出しであり、T.&(x, y) は選択された演算子 & の呼び出しです。つまり、最初に x が評価され、その結果に対して演算子 false が呼び出され、x が確実に false であるかどうかが判断されます。次に、x が明らかに false の場合、演算の結果は、x に対して以前に計算された値になります。それ以外の場合、y が評価され、選択された演算子 & が x について以前に計算された値と y について計算された値に対して呼び出され、演算の結果が生成されます。
リンク先のページ http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx これは、Null 許容値型が導入される前に、Null 許容ブール値を処理する方法でした。
最近では、ArrayList と同じ種類のものに適していると思います。何もない。
私の知る限り、これは false のテストで使用されます。 &&
オペレーターが登場します。&& は短絡するので、式では覚えておいてください。
if ( mFalse && mTrue)
{
// ... something
}
mFalse.false()
呼ばれて戻ってくると true
式は「mFalse.true()」への呼び出しに簡略化されます(その後、返されるはずです) false
, 、そうでないと事態がおかしくなります)。
を実装する必要があることに注意してください。 &
この演算子は式をコンパイルするために使用されます。 mFalse.false()
戻り値 false
.
リンク先の MSDN 記事によると、Nullable より前に null 許容のブール型を許可するために提供されていたようです (つまり、int?、bool? など) 型が C#2 の言語に導入されています。したがって、値が true か false か null かを示す内部値を格納します。あなたの例では、true の場合は >0、false の場合は <0、null の場合は ==0 とすると、SQL スタイルの null セマンティクスが得られます。また、無効を明示的にチェックできるようにするには、.IsNull メソッドまたはプロパティを実装する必要があります。
SQL と比較して、値 Foo が true に設定された 3 行、値 Foo が false に設定された 3 行、および値 Foo が null に設定された 3 行を持つテーブル Table を想像してください。
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE
6
すべての行をカウントするには、次のことを行う必要があります:-
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE OR Foo IS NULL
9
この「IS NULL」構文は、クラス内に .IsNull() と同等のコードを持ちます。
LINQ を使用すると、C# との比較がさらに明確になります。-
int totalCount = (from s in MyTypeEnumerable
where s || !s
select s).Count();
MyTypeEnumberable がデータベースとまったく同じ内容を持っていると想像してください。3 つの値は true、3 つの値は false、3 つの値は null。この場合、totalCount は 6 と評価されます。ただし、コードを次のように書き直すと、-
int totalCount = (from s in MyTypeEnumerable
where s || !s || s.IsNull()
select s).Count();
この場合、totalCount は 9 と評価されます。
false 演算子に関するリンクされた MSDN 記事に記載されている DBNull の例は、まさにこの動作を行う BCL のクラスを示しています。
事実上、結論としては、このタイプの動作が必要であると完全に確信している場合を除き、これを使用すべきではないということです。はるかに単純な null 許容構文を使用する方がよいでしょう。
アップデート: ロジック演算子を手動でオーバーライドする必要があることに気付きました!、||これを適切に機能させるために&&。false 演算子がこれらの論理演算子に入力されると思います。真実、虚偽、または「そうでない」ことを示します。別のコメントで述べたように、!x はすぐには機能しません。過負荷にしなければなりません!奇妙だ!