2013-07-26 2 views
0

Я реализованного в IEquatable интерфейс:Как шаг в методе интерфейса (Равно)

LineItem : IEquatable<LineItem> 

Но теперь я хочу, чтобы отладить мой Equals(...) метод с помощью пошагового кода. Но даже в режиме отладки вмешательство в него не входит (т. Е. F11), и включение точки останова внутри метода также не приводит меня в это. Как я могу его отладить?

Не то, что он должен быть актуальным, но вот мой Equals метод:

public bool Equals(LineItem other) 
      { 
       List<bool> individuals = new List<bool>(); 

       individuals.Add(DateTime.Equals(Expiry, other.Expiry)); 
       individuals.Add(Code == other.Code); 
       individuals.Add(Type == other.Type); 
       individuals.Add(Class == other.Class); 

       Func<object, object, bool> Compare = delegate(object A, object B) 
       { 
        if (A == DBNull.Value || B == DBNull.Value) 
         return A == B; 
        else 
         return (double)A == (double)B; 
       }; 

       individuals.Add(Compare(Strike, other.Strike)); 
       individuals.Add(Compare(Future, other.Future)); 
       individuals.Add(Compare(Premium, other.Premium)); 
       individuals.Add(Compare(Volatility, other.Volatility)); 
       individuals.Add(Compare(Volume, other.Volume)); 
       individuals.Add(Compare(OpenInterest, other.OpenInterest)); 
       individuals.Add(Compare(Delta, other.Delta)); 

       return !individuals.Contains(false); 
      } 

EDIT: Я вызываю метод из других в моем коде, как это сейчас:

if(!fo.Future.Equals(li))... 

, но это все еще не позволяет мне отлаживать его.

+0

У вас проверено, правильно ли указаны символы отладки? –

+0

Обычно появляется диалоговое окно VS, в котором говорится, что он перешагнет ваш код. Вы получаете/получили это? (вы могли бы нажать «нет», чтобы скрыть поле из всех будущих случаев). – gunr2171

+1

Вы уверены, что ваш метод называется? –

ответ

4

LineItem.Equals(a, b) - статический метод вызова Object.Equals(object, object); это не ваш метод.

Эта реализация вызовет a.Equals(object), если вы ее переопределили, но вы ее не переопределили.

+2

Мои психические навыки отладки были почти правильными. – SLaks

+0

Я не понимаю ваш второй пункт о переопределении? Я согласен с первым, но изменение его, как в моем редактировании, не помогло :( – Dan

+0

@Dan: 'li', вероятно, имеет тип' Object' времени компиляции, поэтому вы вызываете 'object.Equals (object)' а не ваша функция. Вероятно, вы должны переопределить 'Equals (object)', чтобы вызвать вашу функцию. – SLaks

15

Вам необходимо сделать большой шаг назад и научиться правильно применять методы равенства. C# был разработан как язык «успеха»; то есть, вы должны, естественно, «впадать» в правильное поведение. К сожалению, равенство не является «удачным» в C#; разработчикам языка не удалось сделать это в первый раз.

Вот шаблон, который я использую, когда я переопределяю равенство.

Прежде всего, напишите частный статический метод, который делает все правильно. Все остальное будет использовать этот метод. Начните свой метод, обратившись к (1) раннему эталонному равенству и (2) нулевым проверкам.

private static MyEquality(Foo x, Foo y) 
{ 
    if (ReferenceEquals(x, y)) return true; 
    // We now know that they are not BOTH null. If one is null 
    // and the other isn't then they are not equal. 
    if (ReferenceEquals(x, null)) return false; 
    if (ReferenceEquals(y, null)) return false; 
    // Now we know that they are both non-null and not reference equal. 
    ... check for value equality here ... 
} 

ОК, теперь, когда у нас есть это, мы можем использовать его для реализации всего остального.

public override bool Equals(object y) 
{ 
    return MyEquality(this, y as Foo); 
} 
public override int GetHashcode() 
{ 
    // Implement GetHashcode to follow the Prime Directive Of GetHashcode: 
    // Thou shalt implement GetHashcode such that if x.Equals(y) is true then 
    // x.GetHashcode() == y.GetHashcode() is always also true. 
} 
public bool Equals(Foo y) 
{ 
    return MyEquality(this, y); 
} 

Вот что необходимо правильно реализовать IEquatable<T>.Equals. Вы должны также рассмотреть переопределение оператора == быть последовательным:

public static bool operator ==(Foo x, Foo y) 
{ 
    return MyEquality(x, y); 
} 
public static bool operator !=(Foo x, Foo y) 
{ 
    return !MyEquality(x, y); 
} 

Теперь независимо от того, звоните ли вы object.Equals(foo, bar), foo.Equals(bar) или foo == bar, у вас есть последовательное поведение.

+0

Спасибо за объяснение, хотя я все еще не уверен, где iEquatable вписывается тогда? Во всяком случае, проблема заключалась в том, что я был вызывая метод объекта вместо метода экземпляра. Теперь я могу отлаживать! – Dan

+1

@Dan: 'IEquatable ' требует, чтобы вы реализовали 'public bool Equals (Foo foo)'. Я сделал это. –

+0

@Dan: Более точная характеристика : проблема заключалась в том, что * метод объекта * и * ваш метод * делали * разные вещи *. Они всегда должны делать то же самое *, которое они делают, если вы будете следовать правильной схеме, как я описал. –

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