una que programacion objetos metodos llamar herencia ejemplos crear como clases clase c# constructor

que - ¿Cuál es el tipo de devolución de un constructor en C#?



metodos en c# (3)

He hecho esta pregunta para Java en este enlace

Recibí algunas respuestas en java. Ahora quiero saberlo en C #.

Como sabemos, no tenemos que agregar ningún tipo de devolución a un constructor de C #.

class Sample{ ..... Sample(){ ........ } }

En Objective C, si creamos un constructor, devuelve un puntero a su clase. Pero no es obligatorio, creo.

AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass

De forma similar, ¿el constructor se convierte a un método que devuelve una referencia a su propia clase?

Me gusta esto:

class Sample{ ..... Sample Sample(){ ........ return this; } }

¿El compilador agrega un tipo de retorno una referencia a la misma clase al constructor? ¿Qué le está pasando a un constructor? Alguna referencia para estudiar esto?


Depende de como lo veas.

El "tipo de devolución" es tan conceptual como cualquier otra cosa.

En el nivel de la semántica en la que C # expresa la intención de un programador, los constructores no tienen tipos de retorno. Ni siquiera tienen el void . Ya no tienen más un tipo de devolución que tú.

La IL a la que se compilarán los constructores tendrá un tipo de void de retorno.

Si invoca un ConstructorInfo , obtiene un objeto del tipo en cuestión (aunque el tipo de retorno de esa invocación es un object y debe convertirlo al tipo correspondiente).

Lo más parecido a un significado concreto a devolver es los detalles de cómo la pila es manipulada por el constructor al que se llama. Aquí, sin embargo, podría argumentar que mientras un tipo de referencia "devuelve" una referencia del tipo apropiado, ya que coloca el valor en la pila, un tipo de valor no lo hace, ya que manipula los valores ya presentes en la pila. O simplemente podría argumentar que ambos son detalles de implementación, y realmente no responden la pregunta.

"No tiene un tipo de devolución" es probablemente la forma más "C # ish" de las formas anteriores de ver la pregunta.


La respuesta de InBetween es correcta. Yo también estoy en desacuerdo con lo que se discutió en el foro de MSDN. Si miramos una muestra de código muy simple como la siguiente:

void Main() { var a = new A(); var message = a.GetAs(); } public class A { private readonly string someAs; public A() { someAs = "AaaaaAAAAAaaAAAAAAAaa"; return; } public String GetAs() { return someAs; } }

y el IL correspondiente:

IL_0000: newobj UserQuery+A..ctor IL_0005: stloc.0 IL_0006: ldloc.0 IL_0007: callvirt UserQuery+A.GetMessage A.GetMessage: IL_0000: ldarg.0 IL_0001: ldfld UserQuery+A.someAs IL_0006: ret A..ctor: IL_0000: ldarg.0 IL_0001: call System.Object..ctor IL_0006: ldarg.0 IL_0007: ldstr "AaaaaAAAAAaaAAAAAAAaa" IL_000C: stfld UserQuery+A.someAs IL_0011: ret

luego queda inmediatamente claro, que el .ctor regresa void . (Esto también se puede ver fácilmente si intentas devolver algo al constructor, es decir, si haces algo como public A() { return this; } el compilador se quejará y dirá algo como "Como A () devuelve el vacío, un retorno la palabra clave no debe ser seguida por una expresión de objeto. ")

Además: Puede ver que esta expresión new A() se traduce a la siguiente IL: newobj UserQuery+A..ctor . La "Referencia de infraestructura de lenguaje común" dice lo siguiente sobre newobj (sección 4.20):

La instrucción newobj asigna una nueva instancia de la clase asociada con el constructor e inicializa todos los campos en la nueva instancia a 0 (del tipo apropiado) o nulo, según corresponda. Luego llama al constructor con los argumentos dados junto con la instancia recién creada. Después de que se ha llamado al constructor, la referencia al objeto ahora inicializado se inserta en la pila.

(A modo de comparación con Objective-C: new / newobj es el análogo al mensaje alloc y el constructor el analógico al mensaje init ).

Entonces, realmente es el new operador el que devuelve una referencia al objeto recién construido, no el constructor en sí mismo.


De acuerdo con la especificación del lenguaje C # 4.0 , sección 1.6:

Las instancias de las clases se crean utilizando el new operador, que asigna memoria para una nueva instancia, invoca un constructor para inicializar la instancia y devuelve una referencia a la instancia.

Es el new operador el responsable de asignar memoria, pasar una referencia del objeto recién asignado al constructor y luego devolver una referencia a la instancia. Este mecanismo también se explica en la sección 7.6.10.1:

El procesamiento en tiempo de ejecución de una expresión de creación de objetos de la forma new T(A) , donde T es tipo de clase o tipo de estructura y A es una lista de argumentos opcional, consta de los siguientes pasos:

  • Si T es un tipo de clase :

    • Se asigna una nueva instancia de clase T Si no hay suficiente memoria disponible para asignar la nueva instancia, se lanza una System.OutOfMemoryException y no se ejecutan más pasos.

    • Todos los campos de la nueva instancia se inicializan a sus valores predeterminados (§5.2).

    • El constructor de instancias se invoca de acuerdo con las reglas de invocación de miembro de función (§7.5.4). Una referencia a la instancia recientemente asignada se pasa automáticamente al constructor de la instancia y se puede acceder a la instancia desde ese constructor como this .

  • [...]

Esto significaría que el constructor per se no tiene ningún tipo de retorno ( void ).