2009-12-15 12 views
10

Mam dwie metody, które są przeciążenia siebieCzy C# intellisense programu Visual Studio może dać wskazówkę, aby wyświetlić najpierw pewne przeciążenie metody?

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 
    } 
} 

W moim przykładzie, getPrice (marka, model, rok) przeciążenie jest tani do wykonania ale metoda getPrice (vinNumber) jest kosztowne. Problem polega na tym, że droga metoda ma najmniejszą liczbę parametrów i pojawia się najpierw w C# intellisense.

Obie metody są ważne, ale chcę, aby zachęcić ludzi do wywołać tanią metodę. Jednak ludzie często nie przeglądają wszystkich przeciążeń w Intellisense przed wyborem metody wywoływania, a kosztowny jest zbyt często wywoływany w bazie kodu mojej firmy.

Czy istnieje jakiś sposób powiadomić Visual Studio dać „priorytet intellisense” do konkretnej metody, dlatego pojawia się po raz pierwszy?

+1

nie wiedzą o swojej ogólne pytanie, ale ten konkretny przypadek może być może być rozwiązana z nazewnictwa np GetPrice dla taniej wersji i QueryPrice lub FetchPrice dla drogiej wersji (aby wskazać, że zamierzasz porozmawiać z bazą danych). Tylko myśl. – itowlson

+1

Jeśli zachodzi potrzeba zachowania kosztownego przeciążenia w celu zapewnienia zgodności, należy zaznaczyć go przy pomocy EdytoraBrowsableAttribute (EditorBrowsableState.Never), aby ukryć go przed Intellisense. – itowlson

+0

Zastanawiam się nad mądrością posiadania trzech połączeń z bazami danych. Na pewno można napisać zapytanie, które zwróci wszystkie potrzebne dane, jednocześnie uderzając w bazę danych tylko raz. –

Odpowiedz

0

Nie sądzę.

ile piszesz wtyczkę intellisense (jak Resharper) i porwać domyślny intellisense i stworzyć program dla użytkowników, aby przypisać priorytet.

+0

Zakładam, że dostaje coś podobnego do [właściwości] do zdefiniowania w pliku źródłowym, aby "podpowiedzieć" IntelliSense o tym, które przeciążenie ma pierwszeństwo. –

1

Co się dzieje, jest to:

  • Podczas wpisywania elementu lub zaznaczyć go na liście, jednolity przeciążenie widzisz jest jeden wymieniony jako pierwszy w kodzie.
  • Po zaakceptowaniu elementu i są wewnątrz nawiasów, pojawia się, aby opierać się na szeregu parametrów, z najmniejszą ilością większości.

Co można rozważyć robi to, zamiast przeciążeń, nazywając członków tego samego na początku i różne na końcu (GetMake vs GetMakeSlow, ale oczywiście coś lepszego niż to), więc pojawiają się razem w IntelliSense ale jest komunikowany, z którego powinieneś skorzystać.

W przeciwnym razie, należy im prawdziwe przeciążeń ale użyć dokumentacji XML umieścić wyraźne ostrzeżenie o powolnym jeden.

+1

To jest to, co myślałem, że pamiętałem również, ale szybki test pokazuje mniej params = pierwszy. –

0

jedynym rozwiązaniem mogę zaoferować to uwagi, ale to nie znaczy, że użytkownik będzie zwracać uwagę na nich:

/// <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: Próbowałem to za to nie robi żadnej różnicy:

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. Znacznik podsumowania w komentarzach XML pojawia się w IntelliSense.
  2. Można ozdobić metodę z przestarzałego tag, który będzie również generować ostrzeżenia lub błędu w zależności od ustawień.

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

Podsumowanie pojawi się w IntelliSense, ale uwagi nie. (Oba będą pojawiać się w wygenerowanej dokumentacji.) Także sprawa #warning nie wydaje się dobrym rozwiązaniem, ponieważ pojawia się jako ostrzeżenie w oryginalnej metodzie, a nie w miejscu, w którym jest wywoływana. –

+0

Kyralessa, myślałem, że znacznik uwagi był częścią Intellisense, ale po prostu przetestowany i potwierdził, że nie są. Dobry punkt na ostrzeżenie, Przestarzały jest sposób, aby przejść do tej trasy. Dzięki za wejście, zredagowałem swoją odpowiedź. – phloopy

+0

Atrybut [Przestarzałe] ostrzeże użytkownika, ale nie wpływa na zamawianie IntelliSense (przynajmniej nie w moim Visual Studio 2012). – yoyo