2012-05-23 5 views
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; 
      } 

    } 

Я сотворенные класс, называемое сложный массивом и намерением этого класса, чтобы сохранить реальные и мнимые числа и различные операторы были перегружены, как +, *,! =, ==Перегрузка операторов в C#

Предположим, что некоторая функция возвращает экземпляр этого класса.

ComplexArray array = GetValue(); 

Я хочу, чтобы проверить, является ли ссылка действительна или нет ...

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

Проблема: Когда значение проверяется на нулевое значение, происходит исключение, потому что внутренне = перегруженных вызовов функций! ==.

Как избежать такой ситуации при перегрузке оператора? Или как сделать оператор! = Или == проверить нулевое значение и вернуть правильные значения (true или false)

+4

Может это не поможет, но я бы использовал класс/struct для комплексного числа и регулярных массивов, чтобы избежать этих проблем. – Anton

+1

Как насчет 'object.Equals (array, null);' или 'array.Equals (null);' –

+1

Я согласен с [Антон] (http://stackoverflow.com/users/149851/anton), есть куча [Коллекции в C#] (http://msdn.microsoft.com/en-us/library/ system.collections.generic.aspx), которые могут быть использованы для этого. – Default

ответ

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(). Хороший рисунок для дела can also be found on SO.

0

Если вы можете настроить таргетинг на .NET Framework 4.0, то System.Numerics.Complex будет выглядеть так, как вам нужно.

0

== Внутри и != перегруженных операторов (на самом верху) поместить следующее:

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

Кстати, я считаю, ваш комплекс реализации номера вида бедных. Вы можете использовать какой-то готовый пример или, по крайней мере, прочитать его.

Смежные вопросы