2011-12-27 3 views
8

В принципе, мне интересно, если я должен слушать ReSharper в этом случае ...Char.Equals vs Object.Equals - ReSharper предполагает, что я должен использовать Object.Equals. Нужно ли мне?

Вы бы понять, что по сравнению с персонажами следует использовать Char.Equals (полукокс), так как это позволяет избежать распаковка, но Resharper предлагает использовать Object.Equals (OBJ). Может, я что-то упустил?


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)) { ... } 

Я предполагаю, что это потому, что есть DependencyProperty поддержка?

+0

Равно от моего понимания сравнивающий как вещи, или в отличие, например, вы не сказали бы Objecta == ObjectB вы бы проверить что с использованием ObjectA.Equals (ObjectB) – MethodMan

+2

Какова фактическая строка кода? Предлагает ли ReSharper какие-либо аргументы в пользу его предложения? –

+1

мой resharper не предполагает, что :) –

ответ

13

невозможно переопределить static членов - Object.Equals() статический член, и Charне может переопределить его, даже если вы можете вызов его по типу Char (параметры по-прежнему относятся к типу Object)

Поэтому не имеет значения, звоните ли вы

Object.Equals(object yourChar, object anotherChar) 

или

Char.Equals(object yourChar, object anotherChar) 

поскольку бокс будет происходить в любом случае.

Чтобы избежать этого, используйте метод экземпляра, который переопределяется в Char:

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

Я бы ожидал, что resharper предложит мне для использования переопределенной версии экземпляра 'Equals'. Является ли это ошибкой или невозможно определить, есть ли экземплярная версия статического члена через отражение? –

+0

см. Комментарий @Joe White на вопрос - ReSharper очень полезен, но он не может сделать * все * для вас. На самом деле, когда я набираю 'Char', а затем' .Equ', ReSharper, похоже, переопределил IntelliSense, чтобы ** скрыть ** 'Object.Equals' ... – Adam

5

Char.Equals(control.SpecialChar, DEFAULT_CHAR) является вызовом Object.Equals(object, object), поэтому здесь приведен правильный выбор.

Я хотел бы предложить использовать control.SpecialChar.Equals(DEFAULT_CHAR) или просто DEFAULT_CHAR == control.SpecialChar