2011-01-19 25 views
27

Supongamos que tengo una función con el parámetro out; sin embargo, no necesito su valor. ¿Hay alguna manera de pasar ningún parámetro real si el resultado dado se descarta de todos modos?¿Hay alguna manera de omitir el parámetro?

EDIT:

Aunque la cuestión ha sido elegido para ser víctima de Optional Output Parameters Sólo si se mira desde la perspectiva del creador método. Si usted es el usuario del método, le interesa no hacer que el parámetro sea opcional, simplemente no lo use sin declarar la variable. Y aunque esto no es posible, con C# 7.0 es posible declararlo en una llamada a método. Así que en lugar de:

int unusedValue; 
TryGetValue("key", out unusedValue); 

que se obtiene:

TryGetValue("key", out int unusedValue); 

o incluso:

TryGetValue("key", out _); 

Esto debe ser añadido como una respuesta, pero:

  • lo que pueda' Haga esto para esta pregunta, porque fue marcado como un engaño;
  • la pregunta que esta pregunta parece ser una tontería en realidad pide una cosa diferente.
+5

no no no no no no – Andrey

Respuesta

22

No puede hacer esto, pero no hay ninguna regla que diga que debe usar el valor que se devuelve. Simplemente puede pasar una variable temporal que nunca volverá a usar.

C# 4.0 permite parámetros opcionales, pero los parámetros out no pueden ser opcionales.

EDIT: Por cierto, también puede sobrecargar el método:

int DoStuff() 
{ 
    int temp; 
    return DoStuff(out temp); 
} 

int DoStuff(out outParam) 
{ 
    //... 
} 
+0

Bueno, sé que no tengo que usarlo. También me gustaría no pasar ninguna variable. Sin embargo, esta es la respuesta, gracias. –

7

Aunque no se puede hacer realmente el parámetro de salida opcional, puede simplemente crear una sobrecarga de la función sin el parámetro de salida, lo cual eliminaría la necesidad de crear una variable temporal.

public void DoSomething(int param1, out int param2) 
{ 
    /* Method work here */ 
} 

public void DoSomething(int param1) 
{ 
    int temp; 
    DoSomething(param1, out temp); 
} 
+0

Esta respuesta es más funcional. No necesita modificar más adelante si desea usarlo o no usarlo más. – elcool

+0

Y si no posee el método que está llamando, puede crear un método de extensión para inventar los parámetros de salida. –

0

No estoy seguro acerca de C#, pero en VB.Net simplemente puede pasar una constante a un parámetro de salida (byref). Entonces, si tiene un número entero, como parámetro de salida, no tiene que pasar una variable real, puede pasar 0 o cualquier otro entero válido. Para los objetos, incluidas las cadenas, puede pasar nada (nulo en C#) y todo funciona bien. No estoy seguro de dónde se almacena la variable, probablemente solo en la pila como en cualquier otro parámetro que pase, y desaparece cuando la función sale.

+0

Lo intenté, desafortunadamente no funcionó. 'error CS1510: un argumento ref o out debe ser una variable asignable'. – MasterMastic

Cuestiones relacionadas