2012-02-10 42 views
33

Resharper gợi ý rằng những điều sau đây được thay đổi từ:C# Loại So sánh: Type.Equals vs toán tử ==

Type foo = typeof(Foo); 
Type bar = typeof(Bar); 

if(foo.Equals(bar)) { ... } 

Để:

if(foo == bar) { ... } 

toán tử ==

// Summary: 
//  Indicates whether two System.Type objects are equal. 
// 
// Parameters: 
// left: 
//  The first object to compare. 
// 
// right: 
//  The second object to compare. 
// 
// Returns: 
//  true if left is equal to right; otherwise, false. 
public static bool operator ==(Type left, Type right); 

Bằng (Loại o)

// Summary: 
//  Determines if the underlying system type of the current System.Type is the 
//  same as the underlying system type of the specified System.Type. 
// 
// Parameters: 
// o: 
//  The System.Type whose underlying system type is to be compared with the underlying 
//  system type of the current System.Type. 
// 
// Returns: 
//  true if the underlying system type of o is the same as the underlying system 
//  type of the current System.Type; otherwise, false. 
public virtual bool Equals(Type o); 

Câu hỏi
Tại sao operator == được khuyến cáo trên Equals(Type o) khi so sánh các loại?

Trả lời

32

Tôi khuyên bạn nên đọc bài đăng blog xuất sắc when is a type not a type? blog của Brad Wilson. Để tóm tắt: một kiểu thời gian chạy (được biểu diễn bằng kiểu nội bộ RuntimeType), được quản lý bởi CLR không phải lúc nào cũng giống như một Type, có thể được mở rộng. Equals sẽ kiểm tra underlying system type, trong khi == sẽ kiểm tra chính loại đó.

Một ví dụ đơn giản:

Type type = new TypeDelegator(typeof(int)); 
Console.WriteLine(type.Equals(typeof(int))); // Prints True 
Console.WriteLine(type == typeof(int));  // Prints False 
5

Lý do rất đơn giản: Hai lý do có chức năng tương đương trong trường hợp này và thứ hai dễ đọc hơn.

+0

R # thường sẽ đề nghị một cái gì đó và cung cấp một lý do chính đáng; trong trường hợp này nếu chúng tương đương về mặt chức năng, tôi nghi ngờ rằng đề xuất là để dễ đọc, đó là chủ quan. Tôi tự hỏi nếu có một lý do khác nó đang được đề xuất? –

+0

@MetroSmurf - R # thường gợi ý mọi thứ vì lợi ích của khả năng đọc (ví dụ như làm tổ trong các câu lệnh if). –

+5

Đó là lý do khá có thể là lý do, nhưng khi hai không tương đương với chức năng trong trường hợp này, thì chắc chắn đây là một sai lầm trong Resharper? –

1

Từ http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx

Các Bằng phương pháp chỉ là một ảo được định nghĩa trong System.Object, và ghi đè bởi bất cứ lớp chọn để làm như vậy. Toán tử == là toán tử có thể bị quá tải bởi các lớp, nhưng thường có hành vi nhận dạng . Đối với các loại tham chiếu trong đó == không bị quá tải, nó so sánh cho dù hai tham chiếu tham chiếu đến cùng một đối tượng - chính xác là những gì thực hiện Equals trong System.Object.

Loại giá trị không cung cấp quá tải cho == theo mặc định. Tuy nhiên, hầu hết các loại giá trị do khung cung cấp cung cấp quá tải của riêng chúng. Việc thực thi mặc định của Equals cho một loại giá trị là do ValueType cung cấp và sử dụng sự phản chiếu để so sánh, làm cho nó chậm hơn đáng kể so với việc thực hiện loại cụ thể theo loại thông thường. Việc triển khai này cũng gọi số Bằng các cặp tham chiếu trong hai giá trị được so sánh.

Tuy nhiên, sự khác biệt chính giữa hai loại so sánh trong sử dụng bình thường (nơi bạn không thể xác định các loại giá trị riêng của mình rất thường xuyên) là đa hình. Các toán tử bị quá tải, không bị ghi đè, có nghĩa là trừ khi trình biên dịch biết gọi phiên bản cụ thể hơn, nó sẽ chỉ gọi phiên bản nhận dạng.

Các vấn đề liên quan