2009-08-31 21 views
18

lợi ích của việc sử dụng các loại cơ sở trong các tham số phương pháp là gì?Resharper cho thấy tham số có thể thuộc loại 'BaseType'

Dưới đây là một mẫu:


private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable. 
{ 
    foreach (var i in numbers) { 
     Console.WriteLine(i); 
    } 
} 



Và đây là another one


public class Foo : ICloneable 
{ 
    public object Clone() 
    { 
     return MemberwiseClone(); 
    } 

    public Foo CopyMe(Foo other) //R# laments: parameter can be ICloneable 
    { 
     return (Foo)other.Clone(); 
    } 
} 

... nơi mà chúng tôi có thể thay đổi kiểu và bất cứ điều gì nhưng Foo sẽ thất bại khi chạy.



Vậy câu hỏi: tôi nên làm gì khi R # gợi ý tham số có thể là kiểu 'X'?




PS. Chỉ là một lời giải thích khác cho Whysharper - a plugin that dovetails Resharper and StackOverflow. Mọi người nói nó đẹp nhưng thiếu những lời giải thích tốt - hy vọng rằng chúng ta có thể làm cho nó tốt hơn;).

+0

tương tự: [IEnumerable như kiểu trả về] (http://stackoverflow.com/q/381208/161052) – JYelton

+0

Tôi giả định Clone() là trong hợp đồng ICloneable. Tôi sẽ đặt ra rằng CopyMe có thể được viết tốt hơn để nó không thất bại trong thời gian chạy. – bubbleking

Trả lời

30

Sử dụng các loại cơ sở cho các thông số có những lợi ích sau:

  • Giảm khớp nối không cần thiết trong mã của bạn
  • Làm cho mã của bạn linh hoạt hơn bằng cách cho phép một phạm vi rộng của đầu vào hợp lệ
  • Làm cho mã của bạn an toàn hơn bằng giới hạn các loại hoạt động có thể được thực hiện trên đầu vào
  • Cải thiện hiệu suất mã của bạn bằng cách giảm nhu cầu thực hiện chuyển đổi giữa các loại

Tuy nhiên, bạn không nên luôn luôn là một loại cơ sở trong một cuộc gọi phương thức chỉ vì một công cụ như ReSharper nói rằng điều đó là có thể. Bạn nên đảm bảo rằng việc sử dụng và ngữ nghĩa của các phương thức là rõ ràng - và những thay đổi trong tương lai không có khả năng yêu cầu di chuyển xuống hệ thống phân cấp thừa kế - có khả năng phá vỡ mã hiện có. Trong các ví dụ trên, sử dụng IEnumerable thay vì List làm cho người gọi mã của bạn có thể vượt qua không chỉ đối tượng List mà còn cả mảng, Stacks, Queues và thậm chí cả kết quả từ cuộc gọi LINQ (chủ yếu trả về IEnumerable). Vì mã của bạn chỉ lặp lại trên bộ sưu tập nên nó không cần biết về Danh sách. Điều này cũng có nghĩa là người tiêu dùng mã của bạn sẽ không phải chuyển đổi bộ sưu tập của họ thành các bản sao của Danh sách loại chỉ để chuyển chúng vào phương thức của bạn.

8
+0

Ai đó có thể giải thích tại sao đây là Liskov? (Tôi tin rằng nó rất tốt có thể được, nhưng tôi sẽ yêu một số làm rõ.) –

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