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
}

所以我创建了ItemCapsule2 种方法来重载运算符

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 ????;
}

但是,问题是我不知道如何编写上述两种方法。

我想做以下

ItemCapsule != null

这实际上是假设执行以下操作

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

我该怎么做?

4

3 回答 3

2

通常你也会为 the 做一个超载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 回答