0
        [Serializable]
        public class ComplexArray
        {
            #region Attributes

            /// <summary>
            /// Array Size
            /// </summary>
            protected int m_iSize;

            /// <summary>
            /// Real part of the data
            /// </summary>
            protected double[] m_dReal;

            /// <summary>
            /// Imaginary part of the data
            /// </summary>
            protected double[] m_dImag;

            #region Construction

            /// <summary>
            /// Default constructor
            /// </summary>
            public ComplexArray()
            {
            }


            public override bool Equals(object o)
            {
                if (this == (ComplexArray)o)
                    return true;
                else
                    return false;
            }



            public static bool operator ==(ComplexArray src1, ComplexArray src2)
            {
                if (src1.m_iSize != src2.m_iSize)
                    return false;

                for (int ii = 0; ii < src1.m_iSize; ii++)
                {
                    if (src1.Real[ii] != src2.Real[ii])
                        return false;
                    if (src1.Imag[ii] != src2.Imag[ii])
                        return false;
                }

                return true;
            }

            public static bool operator !=(ComplexArray src1, ComplexArray src2)
            {

                if (src1 == src2)
                    return false;
                else
                    return true;
            }

    }

我创建了一个名为复数数组的类,该类的目的是保存实数和虚数,并且不同的运算符已被重载,例如 +,*,!=,==

假设某个函数返回这个类的实例。

ComplexArray array = GetValue();

我想检查引用是否有效...

    if(array != null)
    {
      //proceed further....
    }

问题:当根据空值检查该值时,会发生异常,因为内部 != 重载函数调用 ==。

运算符重载时如何避免这种情况?或者如何使运算符 != 或 == 检查空值并返回正确的值(真或假)

4

3 回答 3

0

如果您可以针对 .NET Framework 4.0,System.Numerics.Complex看起来就像您需要的那样。

于 2012-05-23T08:24:18.933 回答
0

==!=重载的运算符(在最顶部)内放置以下内容:

if (src1 == null || src2 == null)
    return false;

顺便说一句,我发现你的复数实现有点差。您可以使用一些现成的示例,或者至少通读一遍。

于 2012-05-23T08:38:13.987 回答
0

这可以通过以下代码完成:

public override bool Equals(object obj)
{
    var other = obj as ComplexArray;

    if(ReferenceEquals(other, null))
    {
        return false;
    }

    if(ReferenceEquals(this, other)
    {
        return true;
    }

    // ToDo: Do all other comparision beyond reference comparision.
}

同样在 == 运算符中,您必须检查双方:

public static bool operator ==(ComplexArray src1, ComplexArray src2)
{
    if(ReferenceEquals(src1, null)
       || ReferenceEquals(src2, null))
    {
        return ReferenceEquals(src1, src2);
    }

    return src1.Equals(src2);
}

public static bool operator !=(ComplexArray src1, ComplexArray src2)
{
    return !(src1 == src2);
}

并且不要忘记,如果您覆盖,Equals()您还必须覆盖GetHashCode(). 在 SO 上也可以找到一个很好的做事模式。

于 2012-05-23T10:49:51.690 回答