2009-12-15 3 views
10

ich zwei Methoden, die in meinem Beispiel Kann C# intellisense von Visual Studio einen Hinweis erhalten, zuerst eine bestimmte Methodenüberladung anzuzeigen?

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

Überlastungen voneinander

sind, ist die GetPrice (Marke, Modell, Jahr) Überlastung billig auszuführen, aber die GetPrice (vinNumber) Methode ist teuer. Das Problem ist, dass die teure Methode die wenigsten Parameter hat und zuerst in C# intellisense angezeigt wird.

Beide Methoden sind gültig, aber ich möchte Leute ermutigen, die billige Methode zu nennen. Aber die Leute neigen dazu, nicht alle Überlastungen in Intellisense durchzusehen, bevor sie eine Methode wählen, um anzurufen, und die teure wird zu oft in der Codebasis meines Unternehmens aufgerufen.

Gibt es eine Möglichkeit, Visual Studio anzuweisen, einer bestimmten Methode "IntelliSense-Priorität" zu geben, damit sie zuerst angezeigt wird?

+1

Sie über Ihre allgemeine Frage nicht wissen, aber dieser spezielle Fall vielleicht mit der Benennung zum Beispiel aufgelöst werden kann GetPrice für die billige Version und QueryPrice oder FetchPrice für die teure Version (um anzuzeigen, dass es mit einer Datenbank sprechen wird). Nur ein Gedanke. – itowlson

+1

Und wenn Sie die teure Überladung aus Kompatibilitätsgründen behalten müssen, markieren Sie sie mit EditorBrowsableAttribute (EditorBrowsableState.Never), um sie vor Intellisense zu verbergen. – itowlson

+0

Ich würde mich wundern über die Weisheit von drei Datenbankaufrufen dort. Sicher könnten Sie eine Abfrage schreiben, die alle Daten zurückgibt, die Sie benötigen, während Sie die Datenbank nur einmal treffen. –

Antwort

0

Denke nicht.

Es sei denn, Sie schreiben ein Intellisense-Plugin (wie Resharper) und hijack die Standard-Intellisense und erstellen Sie ein Programm für Benutzer die Priorität zuweisen.

+0

Nun, ich nehme an, dass er sich auf etwas wie eine [Eigenschaft] bezieht, um in der Quelldatei zu definieren, dass Intellisense darauf hinweist, welche Überladung Priorität hat. –

1

Was passiert, ist dies:

  • Wie Sie das Element eingeben oder in der Liste markieren, die einzelne Überlastung Sie sehen, die einen ersten im Code aufgeführt ist.
  • Nachdem Sie das Element akzeptiert haben und sich in den Klammern befinden, scheint die Reihenfolge auf der Anzahl der Parameter zu basieren, von den wenigsten bis zu den meisten.

Was Sie vielleicht in Erwägung ziehen wird, anstelle von Überlastungen, die Mitglieder zu benennen die gleichen am Anfang und andere am Ende (GetMake vs GetMakeSlow, aber offensichtlich etwas besser als das), so zeigen sie zusammen in Intellisense aber es wird mitgeteilt, was du verwenden sollst.

Andernfalls machen Sie sie wahre Überladungen, aber verwenden Sie XML-Dokumentation, um eine klare Warnung auf die langsame setzen.

+1

Das ist, was ich dachte, erinnerte ich mich auch, aber ein schneller Test zeigt weniger params = zuerst. –

0

Nur Lösung, die ich anbieten kann, ist Kommentare, aber es bedeutet nicht, der Benutzer die Aufmerksamkeit auf sie bezahlen:

/// <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: ich dieses eine versuchte es keinen Unterschied machen, hat:

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. Das Tag Zusammenfassung in XML-Kommentaren wird in Intellisense angezeigt.
  2. Sie könnten die Methode mit dem Veraltet-Tag versehen, das je nach Einstellungen auch eine Warnung oder einen Fehler generiert.

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

Die Zusammenfassung erscheint in Intellisense, aber die Bemerkungen nicht. (Beide werden in der generierten Dokumentation angezeigt.) Außerdem scheint die #warning-Sache keine gute Option zu sein, da sie in der ursprünglichen Methode als Warnung angezeigt wird und nicht an der Stelle, an der sie aufgerufen wird. –

+0

Kyralessa, ich dachte, das Remarks-Tag wäre Teil von Intellisense, aber nur getestet und bestätigt, dass sie es nicht sind. Guter Punkt auf der Warnung, Obsolet ist der Weg für diese Route. Danke für die Eingabe, ich habe meine Antwort bearbeitet. – phloopy

+0

Das [Obsolete] -Attribut warnt den Benutzer, beeinflusst aber nicht die Intellisense-Sortierung (zumindest nicht in Visual Studio 2012). – yoyo

Verwandte Themen