tipo - C#¿Por qué los métodos parciales pueden usar ref, pero no fuera?
pasar tipo como parametro c# (7)
Muy claro. 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 algo más partial
que simplemente hacer que los archivos de código estén más limpios y organizados (es decir, a la vista)?
Referencia: Artículo de MSDN : "Los métodos parciales pueden tener parámetros de ref pero no de out ".
Como todos los demás han declarado out
parámetros deben ser asignados. Para agregar esto se generará un error de compilación. CS0177 ref
por otro lado, debe asignarse antes de realizar la llamada.
Debido a que a diferencia de los parámetros de referencia, los parámetros de salida DEBEN ser inicializados antes de que el método regrese. Si no se implementa el método parcial (que es un escenario válido), ¿cómo se puede inicializar?
Mi conjetura sería porque out
parámetros externos no necesitan inicializarse mientras que los parámetros ref
.
Si usó un parámetro de out
en un método parcial, ¿cómo podría C # verificar que el parámetro se haya inicializado o no?
Supongo que el motivo es porque un método parcial con solo una firma (es decir, sin implementación) sigue siendo válido. Si tuviera un parámetro de salida, un método sin implementación siempre causaría un error (ya que no hay nada que asigne el valor de salida)
Tienes que considerar qué sucede si no se implementa el método parcial.
Lo que sucede entonces es que todas las llamadas al método se eliminan como si nunca hubieran ocurrido.
Entonces, para un método que se usa, se vería así:
stream s;
GetStream(out s);
s.Write(...);
y ser compilado como si dijera esto:
stream s;
s.Write(...);
Este código no está permitido porque s
no se ha inicializado. La garantía de que la variable se inicializaría en el momento en que intentes llamar al método Write
en ella se vinculó con la llamada a GetStream
.
Es lo mismo con los métodos que devuelven 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 dejar el código que lo considera válido. En términos de valores de out
y retorno, tiene el potencial de dejar el código de llamada inválido o incompleto, por lo que no está permitido.
En cuanto a la ref
, eso es válido ya que la inicialización ha sido atendida por el código de llamada:
stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
s.Write(...);
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 ser implementados. Significaría que múltiples fragmentos de código intentan asignar un valor al parámetro OUT.
Un parámetro de 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 a su valor predeterminado (0, nulo, etc.) en lugar de ejecutar la llamada al método. De esa manera, la variable todavía se inicializaría definitivamente, aunque el valor predeterminado puede no ser terriblemente útil. Creo que el equipo de C # ha considerado esto, incluso puede convertirlo en una versión futura, ¿quién sabe? Personalmente dudo que sea particularmente útil, pero existe la posibilidad.
Por el momento, siempre podría usar un parámetro de ref
lugar, y simplemente inicializar la variable manualmente antes de la llamada a cualquiera que sea el valor predeterminado.