2009-04-04 6 views
11

Il primo parametro di un metodo di estensione C# è l'istanza in cui è stato richiamato il metodo di estensione. Ho adottato un idioma, senza vederlo altrove, di chiamare quel "sé" variabile. Non sarei sorpreso se gli altri lo usassero pure. Ecco un esempio:Quale idioma (se esiste) preferisci per nominare il parametro "this" ai metodi di estensione in C# e perché?

public static void Print(this string self) 
{ 
    if(self != null) Console.WriteLine(self); 
} 

Tuttavia, sto iniziando a vedere gli altri nome che parametro "@This", come segue:

public static void Print(this string @this) 
{ 
    if(@this != null) Console.WriteLine(@this); 
} 

E come terza opzione, alcuni preferiscono non linguaggio a tutti , dicendo che "sé" e "@questo" non forniscono alcuna informazione. Penso che siamo tutti d'accordo che a volte c'è un nome chiaro e significativo per il parametro, specifico per il suo scopo, che è meglio di "self" o "@questo". Alcuni vanno oltre e dicono che è possibile sempre venire con un nome più prezioso. Quindi questo è un altro punto di vista valido.

Quali altri idiomi hai visto? Che idioma preferisci e perché?

risposta

3

Ho visto obj e val usato. Non mi piace questo. Dovremmo cercare di evitare l'uso di parole chiave. Non ho mai visto se stesso ma mi piace.

+0

Sono tendenzialmente d'accordo con Abotu che si allontana dalle parole chiave. –

+0

@questa non è una parola chiave. –

+0

Si utilizza @ per evitare parole chiave. Si tratta di una parola chiave. – JoshBerke

1

Si potrebbe fare qualcosa di simile ...

public static void Print(this string extended) 
{ 
    if(extended != null) Console.WriteLine(extended); 
} 
+0

No non si poteva :) Intendevi usare "@questo" in modo coerente o "esteso" in modo coerente? –

+0

Sta solo dicendo che hai un refuso. In un posto si usa ancora "@questo" e nell'altro si usa "esteso". –

+0

Grazie per la cattura ... – bytebender

16

nomino è abbastanza normalmente, basato sull'uso. Quindi "sorgente" per la sequenza sorgente di un operatore LINQ, o "argomento"/"parametro" per un'estensione che esegue il controllo parametro/argomento, ecc.

Non penso che debba essere particolarmente correlato a "questo "o" self "- che non fornisce alcuna informazione aggiuntiva su che significa del parametro. Sicuramente questa è la cosa più importante.

EDIT: Anche nel caso in cui non ci sia un sacco di significato ovvio, preferirei alcuni senso alla nessuno. Quali informazioni sono conferite da "self" o "@questo"? Semplicemente è il primo parametro in un metodo di estensione - e questa informazione è già evidente dal fatto che il parametro è decorato con this. Nel caso in cui viene fornita l'opzione theStringToPrint/self, utilizzerei invece lo outputText, che trasmette tutto ciò che è necessario sapere sul parametro, IMO.

+0

In molti casi, sono d'accordo con te. Ma spesso un metodo di estensione è così generico che non esiste un nome migliore di qualcosa come "theStringToPrint". Modificherò il mio post per fare una distinzione tra questi 2 casi. –

+0

Modificherò la mia risposta per coprire anche questo :) –

+0

Cool. Non posso dire di esserne convinto, ma certamente avete un punto di vista ragionevole. So di aver scritto i metodi di estensione in entrambi i modi. Quando c'è un nome significativo lo uso. Ma ci sono molti casi in cui si sente l'informazione migliore che posso dare è che questo è il parametro "auto-like". –

2

Io lo chiamo 'destinazione', poiché il metodo di estensione opererà su quel parametro.

+0

Sì! Come nei test unitari, questo è l'obiettivo del metodo operativo. La maggior parte dei metodi non ha un preciso "obiettivo" a cui sono esplicitamente mirati, ma i test unitari e i metodi statici lo fanno. L'intero scopo del metodo è quello di un oggetto, quindi quello è l'obiettivo del metodo. –

2

Credo che questo dovrebbe essere evitato poiché utilizza la caratteristica più specifica della lingua mai vista (@). In realtà, tutto ciò che può causare confusione o diminuire la leggibilità, come le parole chiave che appaiono dove non sono parole chiave, dovrebbe essere evitato. self mi ricorda python ma potrebbe essere utile per una convenzione di denominazione coerente in quanto è chiaro che si riferisce all'istanza in uso pur non richiedendo alcuni brutti accorgimenti sintattici.

4

Nome la variabile esattamente come la chiamerei se fosse un semplice metodo statico vecchio. Il motivo è che può ancora essere chiamato come un metodo statico e devi considerare questo caso d'uso nel tuo codice.

Il modo più semplice per esaminare questo è la convalida degli argomenti.Considera il caso in cui null è passato nel tuo metodo. Si dovrebbe fare il controllo degli argomenti e lanciare un'eccezione ArgumentNullException. Se è implementato correttamente, dovrai inserire "questo" come nome dell'argomento in questo modo.

public static void Print(this string @this) { 
    if (null == @this) { 
    throw new ArgumentNullException("this"); 
    } 
    ... 
} 

Ora qualcuno è una marcatura di contro la vostra biblioteca e diventa improvvisamente un dialogo un'eccezione che dice "questo è nullo". Saranno più confusi :)

Questo è un esempio un po 'forzato, ma in generale considero i metodi di estensione non diversi da un semplice metodo statico precedente. Trovo che sia più facile ragionare.