質問

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 はすぐには機能しません。過負荷にしなければなりません!奇妙だ!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top