2011-12-27 8 views
8

Zasadniczo, zastanawiam się czy powinienem słuchać ReSharper w tym przypadku ...Char.Equals vs Object.Equals - ReSharper sugeruje, że powinienem użyć Object.Equals. Czy powinienem?

Można by zrozumieć, że w stosunku do znaków należy użyć Char.Equals (char), ponieważ unika unboxing, ale Resharper sugeruje użycie Object.Equals (obj). Może czegoś tutaj brakuje?


private const DEFAULT_CHAR = '#'; 

// DependencyProperty backing 
public Char SpecialChar 
{ 
    get { return (Char)GetValue(SpecialCharProperty); } 
} 

// ReSharper - Access to a static member of a type via a derived type. 
if (Char.Equals(control.SpecialChar, DEFAULT_CHAR)) { ... } 

Zgaduję, że to dlatego, że jest podkład DependencyProperty?

+0

równości z moim rozumieniem porównuje jak rzeczy lub w przeciwieństwie na przykład nie powie ObjectA == objectB chcesz sprawdzić przy użyciu ObjectA.Equals (ObjectB) – MethodMan

+2

Jaka jest rzeczywista linia kodu? Czy ReSharper podaje jakieś uzasadnienie dla swojej sugestii? –

+1

mój resharper nie sugeruje tego :) –

Odpowiedz

13

Jest niemożliwe, aby zastąpić static członków - Object.Equals() jest członkiem statyczne i Charnie może nadpisać, chociaż można wezwanie go w typie Char (parametry nadal są typu Object)

Dlatego nie ma znaczenia, czy zadzwonisz pod numer

Object.Equals(object yourChar, object anotherChar) 

lub

Char.Equals(object yourChar, object anotherChar) 

ponieważ boks wystąpią w obu przypadkach.

Aby tego uniknąć, należy zastosować metodę instancji, który jest zastępowany w Char:

if (yourChar.Equals(anotherChar)) doSomething(); 
+0

Spodziewałbym się, że resharper zasugeruje mi aby użyć nadpisanej wersji instancji 'Equals'. Czy jest to błąd, czy nie jest możliwe wykrycie, czy istnieje wersja instancji statycznego elementu przez odbicie? –

+0

zobacz komentarz @Joe White na pytanie - ReSharper jest całkiem pomocny, ale nie może zrobić * wszystkiego * dla ciebie. W rzeczywistości, kiedy wpisuję 'Char', a następnie' .Equ', wydaje się, że ReSharper przesłonił IntelliSense ** ukryć ** 'Object.Equals' ... – Adam

5

Char.Equals(control.SpecialChar, DEFAULT_CHAR) to połączenie z Object.Equals(object, object), więc resharper jest tutaj poprawny.

Proponuję użyć control.SpecialChar.Equals(DEFAULT_CHAR) lub po prostu DEFAULT_CHAR == control.SpecialChar

Powiązane problemy