2011-12-27 7 views
8

Về cơ bản, tôi tự hỏi liệu mình có nên nghe ReSharper trong trường hợp này không ...Char.Equals vs Object.Equals - ReSharper gợi ý rằng tôi nên sử dụng Object.Equals. Tôi có nên không?

Bạn sẽ thấy rằng so sánh với các ký tự, bạn nên sử dụng Char.Equals (char) vì nó tránh unboxing, nhưng Resharper đề xuất sử dụng Object.Equals (obj). Có lẽ tôi đang thiếu một cái gì đó ở đây?


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

Tôi đoán đó là vì có một sự ủng hộ DependencyProperty?

+0

Các Equals từ hiểu biết của tôi so sánh như những điều hay không giống như ví dụ bạn sẽ không nói ObjectA == ObjectB bạn sẽ kiểm tra sử dụng ObjectA.Equals (ObjectB) – MethodMan

+2

Dòng mã thực sự là gì? ReSharper có đưa ra bất kỳ lý do nào cho đề xuất của nó không? –

+1

Trình chia sẻ lại của tôi không đề xuất rằng :) –

Trả lời

13

Không thể ghi đè static thành viên - Object.Equals() là thành viên tĩnh, và Charkhông thể ghi đè nó, mặc dù bạn có thể gọi nó trên loại Char (các thông số vẫn là loại Object)

Do đó, nó không có sự khác biệt cho dù bạn gọi

Object.Equals(object yourChar, object anotherChar) 

hoặc

Char.Equals(object yourChar, object anotherChar) 

từ đấm bốc sẽ xảy ra trong cả hai trường hợp.

Để tránh điều này, sử dụng phương pháp dụ, mà được ghi đè trong Char:

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

Tôi mong rằng việc chia sẻ lại sẽ gợi ý cho tôi để sử dụng phiên bản thể hiện được ghi đè của 'Bằng’. Đây có phải là một lỗi hoặc là nó không thể phát hiện nếu có một phiên bản thể hiện của một thành viên tĩnh thông qua sự phản ánh? –

+0

xem nhận xét của @Joe White về câu hỏi - ReSharper khá hữu ích, nhưng nó không thể làm * mọi thứ * cho bạn. Trong thực tế, khi tôi gõ 'Char' và sau đó' .Equ', ReSharper dường như đã ghi đè IntelliSense thành ** hide ** 'Object.Equals' ... – Adam

5

Char.Equals(control.SpecialChar, DEFAULT_CHAR) là cuộc gọi đến Object.Equals(object, object), vì vậy tính năng chia sẻ lại chính xác tại đây.

tôi sẽ đề nghị sử dụng control.SpecialChar.Equals(DEFAULT_CHAR) hoặc chỉ DEFAULT_CHAR == control.SpecialChar