2

私には2つのクラスがあります:

public class Item {
   //MyFields
}

public class ItemCapsule {
    public Item MyItem { get; set; };
}

コードのどこかに、私は書きます

ItemCapsule itemCapsule;
if (itemCapsule  != null && itemCapsule.MyItem != null) {
    //action
}

私はこれをしたいかもしれません:

ItemCapsule itemCapsule;
if (itemCapsule  != null) {
    //action
}

そこでItemCapsule、演算子をオーバーロードする2つのメソッドを作成しました

public static bool operator ==(ItemCapsule capsule, ???? what to write ????)
{
    return ???? what to write ????;
}

public static bool operator !=(ItemCapsule capsule, ???? what to write ????)
{
    return ???? what to write ????;
}

しかし、問題は、上記の2つのメソッドの書き方がわからないことです。

次のことをしたい

ItemCapsule != null

これは実際には次のことを行うと想定されています

ItemCapsule != null && ItemCapsule.MyItem != null

どうすればいいのですか?

4

3 に答える 3

2

通常、equalsあまりにもオーバーロードを行います。

そのようです

        public static bool operator ==(ItemCapsule  x, ItemCapsule  y)
        {
            bool xnull, ynull;
            xnull = Object.ReferenceEquals(x, null);
            ynull = Object.ReferenceEquals(y, null);
            if (xnull && ynull) return true;
            if (xnull || ynull) return false;
            return x.Equals(y);
        }

        public static bool operator !=(ItemCapsule  x, ItemCapsule  y)
        {
            bool xnull, ynull;
            xnull = Object.ReferenceEquals(x, null);
            ynull = Object.ReferenceEquals(y, null);
            if (xnull && ynull) return false;
            if (xnull || ynull) return true;
            return !x.Equals(y);
        }

        public override bool Equals(object obj)
        {
            if (obj == null) return false;
            return ((ItemCapsule )obj).Id == Id;
        }
于 2013-02-19T07:04:29.120 に答える
0

いくつかの拡張方法の方がうまくいくでしょう。演算子のオーバーロードは、将来の自分自身を含め、誰もがコードを理解できないようにするため、絶対に最後のリソースである必要があります。

public static class ExtensionMethods {
    public static bool IsNullOrEmpty(this ItemCapsule item) {
        return (item != null && item.MyItem != null);
    } 

    public static bool Equals(this ItemCapsule firstItem, ItemCapsule secondItem) {
        return (firstItem.MyItem.Equals(secondItem.MyItem)); //see below
    }

    public static bool Equals(this Item firstItem, Item secondItem) {
        // perform the comparison of your 'Item' objects here
    }
}

IsEmptyまた、必要なコードがさらに少ないため、クラスで提案されたフィールドも気に入っています。

于 2013-02-19T07:42:02.897 に答える
-2

これはあなたを助けるでしょう:

public static bool operator == (ItemCapsule capsule1, ItemCapsule capsule2)
{
    return capsule2 != null && (capsule1 != null && capsule1.MyItem == capsule2.MyItem);
}

public static bool operator !=(ItemCapsule capsule1, ItemCapsule capsule2)
{
    return capsule2 != null && (capsule1 != null && capsule1.MyItem != capsule2.MyItem);
}
于 2013-02-19T07:10:47.570 に答える