C # tiene las palabras clave outy ref. ¿Por qué se requieren estos dos? Descargo de responsabilidad: no tengo un conocimiento profundo de C #.
c#
parameters
keywords
Neo
fuente
fuente

refyout? ¿O se pregunta cuál es el uso de los argumentos por referenciaref/outen comparación con los argumentos por valor (sin modificador del parámetro)? ¿O ambos?Respuestas:
En cuanto a la implementación, son esencialmente lo mismo, pero
outcomunican algo querefno lo hace: a usted no le importan las entradas. Esto significa ciertas cosas para usted y para las herramientas. Por ejemplo, puede pasar una variable no inicializada a unoutparámetro y eso no es un problema, de lo contrario sería, y dentro de la función debe asignar un valor aloutparámetro antes de que regrese, mientras que no es necesario hacer nada en Todo con unrefvalor.fuente
outle da una manera de hacerlo que mejor coincida con la forma en que desea tratar las variables en primer lugar.outparámetro porque la función que lo recibe no va a leerlo .Para comprender estas dos palabras clave, deberá comprender qué significa pasar un valor por referencia . Esencialmente significa que, si modifica la variable de parámetro que pasa dentro del método o función, esa variable retiene su valor modificado cuando finaliza su función. Declarar un parámetro como
refooutlogra esto, mientras que una variable de parámetro ordinaria retendría su valor original, incluso si lo modificara en la función.La única diferencia entre
refyoutes queoutno requiere que inicialice la variable antes de pasarla a la función, perorefsí; mientras queouthace que tenga que ceder algo a la variable dentro de la función, perorefno lo hace.fuente
Tu preguntaste.
Y la respuesta es que no son OBLIGATORIAS, por ejemplo, Java tampoco tiene y VB solo tiene ref (y solo lo requiere en la declaración del método).
Puede escribir fácilmente un programa completo sin usar ninguno.
Existen porque ocasionalmente son útiles. Es por eso que hay dos de ellos y no solo uno, porque es útil hacer la distinción entre 'aquí hay algo, modificarlo si quieres' y 'darle un nuevo valor a esta cosa'.
Otros idiomas tienen prioridades diferentes y, por lo tanto, pueden incluir o no estos o equivalentes. Incluso pueden estar en desacuerdo sobre si alguno es útil, por lo que pueden decidir activamente NO implementar uno u otro.
fuente
En su esencia tanto
refyoutproporcionar un mecanismo para pasar la dirección de una variable a un método para que pueda ser actualizado - asignar a larefooutparámetro actualiza la variable en el contexto del llamador. Donde difieren es en las garantías:outgarantiza que la variable se actualizará,refno.Desde el otro lado de la llamada hay diferencias similares.
outNo se garantiza que un parámetro de nuestro método contenga nada útil a la llegada y debe establecerse en un valor en algún momento, mientrasrefque se puede suponer que un parámetro tiene un valor y no necesitamos hacer nada específico con él.Esta diferencia tiene un impacto en el análisis, la generación y la optimización del código que, aunque no es muy evidente para nosotros la mayor parte del tiempo, puede tener algunos efectos en la forma en que nuestros programas terminan operando. El generador de código puede diferir la asignación de la variable hasta inmediatamente antes de la llamada, el optimizador puede decidir que puede reordenar algunas operaciones de manera más efectiva en función del contrato, etc.
En términos de uso: como regla general, lo uso
outpara situaciones en las que no me importa el contenido de la variable cuando llega como parámetro yrefcuando lo hago.fuente