日期:2014-05-19  浏览次数:20770 次

■■■重载==操作符的问题
我先在编写一个类时需要重载==操作符以判断类的成员数据是否相等,但遇到了一个诡异的问题:

当我在进行成员数据的判断之前,先需要判断该实例是否为null(因为如果为null,则会产生异常),而要判断该实例是否为null,又需要调用==操作符,这样就形成了无限递归而导致堆栈溢出异常。

请问大家是如何处理这个问题的?

代码如下:

                public   static   bool   operator   ==(Hex   h1,Hex   h2)
                {
                        if   (h1   ==   null   ||   h2   ==   null)     //此处导致无限递归而堆栈溢出
                                return   false;
                       
                        if   (h1.getBytesCount()   !=   h2.getBytesCount())   //如果不判断对象为null,此处就会产生异常
                                return   false;

                        byte[]   b1   =   h1.getBytes();
                        byte[]   b2   =   h2.getBytes();
                        for   (int   i   =   0;   i   <   b1.Length;   i++)
                        {
                                if   (b1[i]   !=   b2[i])
                                        return   false;
                        }
                        return   true;
                }

------解决方案--------------------
不要在引用类型中重载==运算符!
参考《Effective C#》原则9 Understand the Relationships Among ReferenceEquals(), static Equals(), instance Equals(), and operator==

http://www.cnblogs.com/WuCountry/archive/2007/02/25/656433.html
------解决方案--------------------
可以用ReferenceEquals来判断。
另外同意ls的,C#里不要重载==,用Equals方法。