2009-12-15 9 views
10

Tôi có hai phương pháp là định nghĩa chồng cho nhauC# intellisense của Visual Studio có thể đưa ra một gợi ý để hiển thị một phương thức nhất định quá tải trước không?

public class Car 
{ 
    public int GetPrice(string vinNumber) 
    { 
     string make = Database.GetMake(vinNumber); // expensive operation 
     string model = Database.GetModel(vinNumber); // expensive operation 
     int year = Database.GetYear(vinNumber); // expensive operation 

     return this.GetPrice(make, model, year); 
    } 

    public int GetPrice(string make, string model, int year) 
    { 
     // Calculate value and return 
    } 
} 

Trong ví dụ của tôi, getPrice (thực hiện, mô hình, năm) tình trạng quá tải là giá rẻ để thực hiện nhưng phương pháp getPrice (vinNumber) là tốn kém. Vấn đề là phương pháp đắt tiền có các thông số ít nhất và nó xuất hiện đầu tiên trong C# intellisense.

Cả hai phương pháp đều hợp lệ, nhưng tôi muốn khuyến khích mọi người gọi phương thức rẻ tiền. Nhưng mọi người có xu hướng không xem xét tất cả các tình trạng quá tải trong Intellisense trước khi chọn một phương pháp để gọi, và cái đắt tiền đang được gọi quá thường xuyên trong codebase của công ty tôi.

Có cách nào để yêu cầu Visual Studio đưa "ưu tiên intellisense" cho một phương thức cụ thể để nó hiển thị trước không?

+1

Không biết về câu hỏi chung của bạn, nhưng trường hợp cụ thể này có lẽ có thể được giải quyết với việc đặt tên ví dụ GetPrice cho phiên bản giá rẻ và QueryPrice hoặc FetchPrice cho phiên bản đắt tiền (để gợi ý rằng nó sẽ đi nói chuyện với một cơ sở dữ liệu). Chỉ là một ý nghĩ. – itowlson

+1

Và nếu bạn cần phải giữ quá tải tốn kém xung quanh để tương thích, hãy đánh dấu nó bằng EditorBrowsableAttribute (EditorBrowsableState.Never) để ẩn nó khỏi Intellisense. – itowlson

+0

Tôi tự hỏi về sự khôn ngoan của việc có ba cuộc gọi cơ sở dữ liệu ở đó. Chắc chắn bạn có thể viết một truy vấn trả về tất cả dữ liệu bạn cần trong khi chỉ nhấn cơ sở dữ liệu một lần. –

Trả lời

0

Đừng nghĩ vậy.

Trừ khi bạn viết một plugin intellisense (như Resharper) và xâm nhập vào intellisense mặc định và tạo chương trình cho người dùng để gán mức độ ưu tiên.

+0

Vâng, tôi cho rằng anh ta đang nhận được một thứ gì đó giống như [thuộc tính] để xác định trong tệp nguồn để "gợi ý" Intellisense vì quá tải nào được ưu tiên. –

1

gì sẽ xảy ra đây là:

  • Khi bạn nhập thành viên hoặc đánh dấu nó trong danh sách, sự quá tải duy nhất bạn thấy là một liệt kê đầu tiên trong mã.
  • Sau khi bạn chấp nhận thành viên và nằm trong dấu ngoặc đơn, thứ tự dường như dựa trên số lượng tham số, từ ít nhất đến nhiều nhất.

Những gì bạn có thể xem xét làm được, thay vì quá tải, đặt tên cho các thành viên cùng lúc đầu và khác nhau ở phần cuối (GetMake vs GetMakeSlow, nhưng rõ ràng là một cái gì đó tốt hơn) để họ xuất hiện cùng nhau trong Intellisense nhưng nó được truyền đạt mà bạn nên sử dụng.

Nếu không, hãy làm cho chúng quá tải thực sự nhưng sử dụng tài liệu XML để đưa ra cảnh báo rõ ràng về cảnh báo chậm.

+1

Đó là những gì tôi nghĩ rằng tôi nhớ là tốt, nhưng một thử nghiệm nhanh chóng cho thấy ít params = đầu tiên. –

0

Chỉ giải pháp tôi có thể cung cấp là ý kiến, nhưng nó không có nghĩa là người dùng sẽ chú ý đến chúng:

/// <summary> 
    /// This method should be used as a last resort... 
    /// </summary> 
    /// <param name="vinNumber"></param> 
    /// <returns></returns> 
    public int GetPrice(string vinNumber) 
    { 
     ... 
    } 

    /// <summary> 
    /// This is the preferred method... 
    /// </summary> 
    /// <param name="make"></param> 
    /// <param name="model"></param> 
    /// <param name="year"></param> 
    /// <returns></returns> 
    public int GetPrice(string make, string model, int year) 
    { 
     ... 
    } 

Edit: tôi đã cố gắng một này nó đã không thực hiện bất kỳ sự khác biệt:

class Class1 
{ 
    public static void Method(int value1) { } 
    public static void Method(int value1, int value2) { } 
    public static void Method(int value1, int value2, int value3) { } 
} 

class Class2 
{ 
    public static void Method(int value1, int value2, int value3) { } 
    public static void Method(int value1, int value2) { } 
    public static void Method(int value1) { } 
} 
2
  1. Thẻ tóm tắt trong nhận xét XML hiển thị trong Intellisense.
  2. Bạn có thể trang trí phương thức bằng thẻ Quá cũ, thẻ này cũng sẽ tạo cảnh báo hoặc lỗi tùy thuộc vào cài đặt.

    [System.Obsolete("use GetPrice(make, model, year)")] 
    
+0

Tóm tắt hiển thị trong Intellisense, nhưng những nhận xét thì không. (Cả hai sẽ hiển thị trong tài liệu được tạo.) Ngoài ra, điều #warning dường như không phải là một lựa chọn tốt, bởi vì nó hiển thị như một cảnh báo trong phương thức ban đầu, không phải ở nơi nó được gọi. –

+0

Kyralessa, tôi nghĩ rằng thẻ nhận xét là một phần của Intellisense nhưng chỉ được kiểm tra và xác nhận là không. Điểm tốt về cảnh báo, Lỗi thời là cách để đi cho tuyến đường đó. Cảm ơn bạn đã nhập, tôi đã chỉnh sửa câu trả lời của mình. – phloopy

+0

Thuộc tính [Lỗi thời] sẽ cảnh báo người dùng, nhưng không ảnh hưởng đến việc sắp xếp Intellisense (ít nhất là không có trong Visual Studio 2012) của tôi. – yoyo