可重载的运算符==和!=

时间:2013-02-19 06:59:56

标签: c# c#-4.0 c#-3.0 operator-overloading

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

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

我想做以下

ItemCapsule != null

实际上假设要执行以下操作

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

我该怎么办?

3 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分: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字段,因为需要更少的代码。

答案 2 :(得分:-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);
}