2009-12-15 12 views
10

Ho due metodi che sono sovraccarichi di ogni altraÈ possibile fornire a C# intellisense di Visual Studio un suggerimento per visualizzare prima un certo overload di metodi?

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

nel mio esempio, il GetPrice (marca, modello, anno) di sovraccarico è a buon mercato per l'esecuzione, ma il metodo GetPrice (vinNumber) è costoso. Il problema è che il metodo costoso ha il minor numero di parametri e compare prima nell'intelligenza C#.

Entrambi i metodi sono validi, ma desidero incoraggiare le persone a chiamare il metodo economico. Ma le persone tendono a non guardare attraverso tutti i sovraccarichi di Intellisense prima di scegliere un metodo per chiamare, e quello costoso viene chiamato troppo spesso nella base di codice della mia azienda.

C'è un modo per dire a Visual Studio di dare "priorità intellisense" a un metodo particolare in modo che venga visualizzato per primo?

+1

non sappiamo circa la vostra domanda di carattere generale, ma questo caso specifico potrebbe forse essere risolto con la denominazione per esempio GetPrice per la versione economica e QueryPrice o FetchPrice per la versione costosa (per suggerire che andrà a parlare con un database). Solo un pensiero. – itowlson

+1

E se è necessario mantenere il costoso sovraccarico per compatibilità, contrassegnarlo con EditorBrowsableAttribute (EditorBrowsableState.Never) per nasconderlo da Intellisense. – itowlson

+0

Mi chiedo la saggezza di avere tre chiamate al database lì. Sicuramente potresti scrivere una query che restituisce tutti i dati di cui hai bisogno mentre colpisci il database una sola volta. –

risposta

0

Non penso.

A meno che non si scriva un plug-in intellisense (come Resharper) e l'hijack di default intellisense e si crei un programma per gli utenti che assegnano la priorità.

+0

Bene, presumo che stia ottenendo qualcosa come una [proprietà] da definire nel file sorgente per "suggerire" Intellisense su quale sovraccarico ha la priorità. –

1

Quello che succede è questo:

  • Mentre digitate il membro o evidenziare nella lista, il singolo di sovraccarico che si vede è quello elencato per primo nel codice.
  • Dopo aver accettato il membro e sono all'interno delle parentesi, l'ordine sembra essere basato sul numero di parametri, dal più piccolo al più.

Che cosa si potrebbe prendere in considerazione facendo è, invece di sovraccarichi, nominare i membri stessi all'inizio e diverse alla fine (GetMake vs GetMakeSlow, ma ovviamente qualcosa di meglio) in modo da presentarsi insieme in Intellisense, ma è comunicato che dovresti usare.

Altrimenti, rendili veri sovraccarichi ma utilizza la documentazione XML per mettere un avviso chiaro su quello lento.

+1

Questo è quello che pensavo di ricordare, ma un test rapido mostra meno parametri = prima. –

0

unica soluzione che posso offrire è commenti, ma ciò non significa che l'utente pagherà attenzione a loro:

/// <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: Ho provato questo un non faceva alcuna differenza:

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. Il tag di riepilogo nei commenti XML viene visualizzato in Intellisense.
  2. È possibile decorare il metodo con il tag Obsoleto, che genera anche un avviso o un errore in base alle impostazioni.

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

Il riepilogo appare in Intellisense, ma le osservazioni no. (Entrambi appariranno nella documentazione generata). Inoltre, la cosa #warning non sembra una buona opzione, perché si presenta come un avvertimento nel metodo originale, non nel posto in cui è chiamato. –

+0

Kyralessa, pensavo che il tag di annotazione fosse parte di Intellisense, ma ho appena testato e confermato che non lo erano. Buon punto sull'avviso, Obsoleto è la strada da seguire per quel percorso. Grazie per l'input, ho modificato la mia risposta. – phloopy

+0

L'attributo [Obsoleto] avviserà l'utente, ma non ha alcun effetto sull'ordinamento Intellisense (almeno non nel mio Visual Studio 2012). – yoyo

Problemi correlati