2012-03-08 22 views
8

Estoy tratando de entender las consideraciones de diseño del equipo que creó el método Environment.GetCommandLineArgs.Environment.GetCommandLineArgs: ¿por qué es un método? ¿Por qué no una propiedad?

Podría haber sido una propiedad estática, muy similar a System.Web.HttpContext.Current. Después de todo, el valor devuelto no debería cambiar una vez que esté disponible. Por lo tanto, se parece más a una propiedad del proceso actual en ejecución.

Sé que cualquier propiedad en .NET es un azúcar sintáctico para los métodos getter/setter. Pero esa es la razón exacta para usar una propiedad en lugar de un método getter explícito.

¿O tal vez hay algo que me falta aquí?

¿Qué opinas?

+1

El equipo de BCL respetó una distinción semántica entre propiedades y métodos. Las propiedades solo se usan cuando el programador puede/debe considerar una llamada equivalente al acceso a un campo. En este caso, 'GetCommandLineArgs' no funciona de esa manera, entonces es un método. Piense en ello como recuperar o calcular el valor de nuevo cada vez. –

Respuesta

4

Sospecho que es porque hace una copia de la matriz cada vez que la llamas. Por ejemplo, considere este programa:

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]); 
    } 
} 

Si ejecuta esto con "prueba original" todavía se imprimirá "original".

Así, cuando decimos:

Después de todo, el valor devuelto no debería cambiar una vez disponible.

En realidad, se devolverá un valor diferente (una nueva referencia de matriz) en cada llamada, precisamente porque las matrices son siempre mutable.

+0

Hmmmm ... buen punto. Supongo que tienes razón, debería ser una ** copia ** de la matriz original, de ahí una nueva matriz para cada llamada. –

+0

Por eso creo que ['IReadOnlyList '] (http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx) debería haber estado en el Framework por mucho tiempo Hace y usó mucho en lugar de matrices. – svick

+0

@svick: Absolutamente, pero hubiera sido difícil hacer eso antes de los genéricos ... –

0

Según mi entender, los métodos se usan para acciones (hacer algo). Así que llamar a un método significará que está pasando por una gran parte (ger) de la lógica, como un cálculo o una llamada a un repositorio de base de datos. Y las propiedades son básicamente solo para obtener o establecer variables. Si quieres el nombre de una persona vas a tener una propiedad 'Nombre' y llámala como persona.Nombre y no persona.Nombre(). Pero si quiere la edad de la persona y solo tiene el año de nacimiento, probablemente tenga un método GetAge() con lógica básica para el cálculo de la edad. Quizás estoy completamente equivocado aquí, pero entiendo que los métodos se usan para grandes fragmentos de código y lógica, mientras que las propiedades se usan para (más) simplemente establecer y obtener valores.

Cuestiones relacionadas