2012-03-08 10 views
8

Sto cercando di capire le considerazioni progettuali del team che ha creato il metodo Environment.GetCommandLineArgs.Environment.GetCommandLineArgs - perché è un metodo? Perché non una proprietà?

Potrebbe essere stata una proprietà statica, molto simile a System.Web.HttpContext.Current. Dopo tutto, il valore restituito non dovrebbe cambiare una volta disponibile. Quindi è più simile a una proprietà dell'attuale processo in esecuzione.

So che qualsiasi proprietà in .NET è uno zucchero sintattico per metodi getter/setter. Ma questo è il motivo esatto per usare una proprietà piuttosto che un metodo getter esplicito.

O forse c'è qualcosa che mi manca qui?

Cosa ne pensi?

+1

Il team BCL ha rispettato una distinzione semantica tra proprietà e metodi. Le proprietà vengono utilizzate solo quando il programmatore può/deve prendere in considerazione una chiamata a loro equivalente all'accesso a un campo. In questo caso, 'GetCommandLineArgs' non funziona in questo modo, quindi è un metodo. Pensa a come recupera o calcola il valore di nuovo ogni volta. –

risposta

4

Ho il sospetto che sia perché fa una copia dell'array ogni volta che lo chiami. Ad esempio, si consideri questo programma:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[] argsCopy = Environment.GetCommandLineArgs(); 
     args[0] = "x"; 

     // 0 is the command in this case 
     argsCopy[1] = "y"; 

     string[] argsCopy2 = Environment.GetCommandLineArgs(); 
     Console.WriteLine(argsCopy2[1]); 
    } 
} 

Se si esegue questo con "test originale" sarà ancora stampare "originale".

Quindi, quando si dice:

Dopo tutto, il valore restituito non dovrebbe cambiare una volta disponibile.

realtà, restituirà un valore diverso (un nuovo riferimento matrice) su ogni chiamata, proprio perché gli array sono sempre mutevole.

+0

Hmmmm .. buon punto. Immagino che tu abbia ragione, dovrebbe essere una ** copia ** della matrice originale, quindi una nuova matrice per ogni chiamata. –

+0

Questo è il motivo per cui penso che '' IReadOnlyList '] (http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx) avrebbe dovuto essere nel Framework per molto tempo fa e usato molto invece di matrici. – svick

+0

@svick: Assolutamente - ma sarebbe stato difficile farlo prima dei generici ... –

0

Dalla mia comprensione, i metodi sono utilizzati per le azioni (fare qualcosa). Quindi chiamare un metodo significa che stai attraversando una parte della logica (ger) grande, come un calcolo o una chiamata a un repository di database. E le proprietà sono fondamentalmente solo per ottenere o impostare le variabili. Se vuoi il nome di una persona, avrai una proprietà 'Nome' e chiamala come person.Name e non person.Name(). Ma se vuoi l'età della persona e hai solo l'anno di nascita, probabilmente avrai un metodo GetAge() con la logica di base per il calcolo dell'età. Forse ho sbagliato completamente qui, ma la mia comprensione è che i metodi sono usati per pezzi più grandi di codice e logica, mentre le proprietà sono usate per (di più) semplicemente impostando e ottenendo valori.

Problemi correlati