2010-06-18 20 views
8

Cuando se define un método con un parámetro out, ¿por qué debo especificar la palabra clave out cuando lo llamo? Ya está allí en la definición de método, y el tiempo de ejecución debe saber que cualquier parámetro pasado será un parámetro de salida.¿Por qué necesitamos usar la palabra clave out mientras llamamos a un método?

Tendría sentido si el compilador aceptará el argumento con o sin la palabra clave out, con semántica diferente, pero si DEBE agregar la palabra clave para compilar el código, ¿cuál es el uso? ¿No debería el compilador manejarlo automáticamente?

Lo mismo para ref

+6

supongo, que es hacer el código más legible. – mohang

Respuesta

3

puede deberse a que C# permite escribir sobrecargas así:

class X 
{ 
    public void Y(int i) { ... } 
    public void Y(out int i) { ... } 
} 

En este caso compila no puede entender que el método con keywork out debe ser llamado si no se escribe esta palabra clave cuando se llama el método. Y generalmente debe escribir out cuando el método se declara con esta clave.

Y, por supuesto, cuando escribe out cuando llama al método, definitivamente sabe que esta variante se puede cambiar en el método. Es muy legible

MSDN Article

11

Es realmente grande para facilitar la lectura. También lo ayudará a evitar comportamientos inesperados. Al llamar al método sin parámetro, definitivamente sabrá que se puede cambiar el valor de la variable aprobada.

+0

No solo 'se puede cambiar' si pasa un parámetro con 'fuera' se cambiará. Los parámetros de salida se deben establecer antes de que regrese el método. – lxalln

+1

Sí valor del mástil en el bloque de cuerpo del método, pero quiero decir que puede establecer el mismo valor para que no se noten cambios. – Incognito

7

Este requisito no existe para el compilador. f (x, out y) informa instantáneamente a quien esté leyendo el código que y se sobrescribirá después de que f regresa, sin la necesidad de buscar la definición de f, guardándolos los ciclos mentales de la CPU.

0

Este es un buen punto, tal vez tiene que ver con la legibilidad. digamos que tenemos un método con dos parámetros, al igual que

bool TryGetString(string input, out string output) 

sin tener que especificar el parámetro de salida, sólo una simple mirada a alguien llamando a ese método, que no tendría ya completa.

0

cuando llama a un método con la palabra clave out, su código de llamada sabe con certeza que se pasa por referencia. En algunos casos, es posible que encuentre un método en la biblioteca de terceros que tenga la palabra clave out en la definición en ese momento cuando llama a ese método, no sabe si el argumento se pasa por referencia o por valor. Por lo tanto, se le obliga a utilizar out en el método de llamada para determinar la legibilidad.

Cuestiones relacionadas