107

C# には 2 つの奇妙な演算子があります。

この権利を理解していれば、これらの演算子は、ブール式の代わりに使用したい型で使用でき、bool への暗黙的な変換を提供したくない場合に使用できます。

次のクラスがあるとしましょう:

    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 演算子は何の役に立つのでしょうか?

注: その他の例は、ここここ、およびここにあります。

4

5 に答える 5

65

&&これを使用して、および||演算子をオーバーライドできます。

&&and演算子は||オーバーライドできませんが、、、をオーバーライドする|&、コンパイラーが正確に正しい方法で呼び出し、andtrueを記述したときに呼び出します。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;
}

これは明らかに副作用であり、使用目的ではありませんが、便利です。

于 2008-08-28T21:02:48.333 に答える
26

Shog9 と Nir: 回答ありがとうございます。これらの回答は、Steve Eichert の記事を示し、 msdnを示しました。

演算 x && y は T.false(x) ? として評価されます。x : T.&(x, y)、ここで、T.false(x) は T で宣言された演算子 false の呼び出しであり、T.&(x, y) は選択された演算子 & の呼び出しです。つまり、x が最初に評価され、その結果に対して演算子 false が呼び出されて、x が完全に false であるかどうかが判断されます。次に、x が明らかに false の場合、演算の結果は x に対して以前に計算された値になります。それ以外の場合は、y が評価され、選択された演算子 & が、以前に計算された x の値と計算された y の値に対して呼び出され、演算の結果が生成されます。

于 2008-08-28T21:23:27.397 に答える
14

http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspxにリンクしているページに は、null許容値タイプが導入される前にnull許容ブールを処理する方法である、それらの目的が記載されています。

最近では、ArrayListと同じ種類のもの、つまりまったく何も使用できないものに適していると思います。

于 2008-08-28T20:28:54.640 に答える
7

AFAIK、&&オペレーターが場に出たときなど、falseのテストで使用されます。覚えておいてください、&&短絡なので、式では

if ( mFalse && mTrue) 
{
   // ... something
}

mFalse.false()が呼び出され、true式が返されると、「mFalse.true()」の呼び出しになります(その後、が返される必要があります。そうしないと、状況がおかしくfalseなります)。

を返す&場合に使用されるため、その式をコンパイルするには演算子を実装する必要があることに注意してください。mFalse.false()false

于 2008-08-28T20:36:16.620 に答える
3

リンクしたMSDNの記事から、Nullable(つまり、int?、bool?など)型がC#2の言語に導入される前に、null許容のブール型を許可するために提供されたようです。したがって、値がtrueかfalseかnullかを示す内部値を格納します。つまり、この例では、trueの場合は> 0、falseの場合は<0、nullの場合は== 0であり、SQLスタイルのnullセマンティクスを取得します。また、nullityを明示的にチェックできるようにするには、.IsNullメソッドまたはプロパティを実装する必要があります。

SQLと比較して、値Fooがtrueに設定された3行、値Fooがfalseに設定された3行、および値Fooがnullに設定された3行のテーブルテーブルを想像してください。

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

この「ISNULL」構文では、クラスに.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許容構文を使用する方がよいでしょう。

更新:論理演算子を手動でオーバーライドする必要があることに気づきました!、|| そして&&これを正しく機能させるために。私は、偽の演算子がこれらの論理演算子にフィードする、つまり、真実、偽り、または「その他」を示すと信じています。別のコメントで述べたように、!xはすぐには機能しません。オーバーロードする必要があります!。奇妙さ!

于 2008-08-28T20:36:10.893 に答える