2010-08-10 18 views
19

Bastante sencillo. MSDN indica que puede usar ref, pero no para métodos parciales. Tengo curiosidad por el ¿por qué? Tenía entendido que cuando se compila el código, los parciales se fusionan, entonces, ¿qué pasa con la restricción? ¿Hay más en partial que simplemente hacer que los archivos de código estén más limpios y organizados (por ejemplo, eyecandy)?C# ¿Por qué los métodos parciales usan ref, pero no salen?

Referencia: MSDN Article - "Los métodos parciales pueden tener ref pero no los parámetros ".

Respuesta

20

Debe considerar lo que sucede si el método parcial no se implementa.

Lo que ocurre entonces es que todas las llamadas al método simplemente se eliminan como si nunca hubieran sucedido.

Así, por un método que utiliza cabo, se vería así:

stream s; 
GetStream(out s); 
s.Write(...); 

y compilarse como si se dijo lo siguiente:

stream s; 
s.Write(...); 

Este código no está permitido porque s no ha sido inicializado La garantía de que la variable se inicializaría cuando intentas llamar al método Write estaba vinculada con la llamada al GetStream.

Lo mismo ocurre con los métodos de devolución de datos. Dado que la llamada al método completo simplemente no se compila si no ha implementado el método parcial, debe considerar lo que puede y no puede hacer y aún así dejar el código que lo llama válido. En términos de out y valores devueltos, tiene el potencial de dejar el código de llamada inválido o incompleto, por lo que no está permitido.

En cuanto a ref, esto es válido, ya que la inicialización ha sido cuidado por el código de llamada:

stream s = null; 
GetStream(ref s); // may be stripped out 
if (s != null) 
    s.Write(...); 
+2

¡Bien explicado! – AlwaysAProgrammer

9

Porque, a diferencia de los parámetros ref, los parámetros de salida DEBEN inicializarse antes de que regrese el método. Si no se implementa el método parcial (que es un escenario válido), ¿cómo se puede inicializar?

+0

y el tipo de valor no inicializado no es legal en el compilador de C#. buena explicación – kokabi

4

Supongo que no es necesario inicializar los parámetros out, mientras que los parámetros ref sí.

Si usó un parámetro out en un método parcial, ¿cómo podría C# verificar que el parámetro se haya inicializado o no?

4

Un parámetro out sugiere que desea un valor fuera del método. Si el método no existe, no puede proporcionar ese valor.

La alternativa sería establecer el valor de la variable explícitamente en su valor predeterminado (0, nulo, etc.) en lugar de ejecutar la llamada al método. De esta forma, la variable aún se inicializaría definitivamente, aunque el valor predeterminado puede no ser muy útil. Creo que el equipo de C# ha considerado esto, incluso puede llegar a una versión futura, ¿quién sabe? Personalmente, dudo que sea particularmente útil, pero la posibilidad está ahí.

Por el momento, siempre puede utilizar un parámetro ref en su lugar, y simplemente inicializar la variable manualmente antes de la llamada a cualquiera que sea el valor predeterminado.

1

yo asumiría la razón es porque un método parcial con sólo una firma (es decir, sin aplicación) aun es válido. Si tuviera un parámetro out, un método sin implementación siempre causaría un error (ya que no hay nada asignando el valor de salida)

1

Un método parcial se divide en clases parciales. Se requiere un método para asignar un valor a un parámetro OUT. Los métodos parciales pueden o no implementarse. Significaría que múltiples fragmentos de código están tratando de asignar valor al parámetro OUT.

1

Como todos los demás han indicado out deben asignarse parámetros. Para agregar esto se generará un error de compilación CS0177ref por otro lado debe asignarse antes de realizar la llamada.

Cuestiones relacionadas