La pregunta principal es cuáles son las implicaciones de permitir que esta palabra clave se modifique con respecto a la utilidad y la memoria; y ¿por qué está permitido esto en las especificaciones del lenguaje C#?Asigne esta palabra clave en C#
Las otras preguntas/subpartes se pueden responder o no si se elige hacerlo. Pensé que las respuestas a ellos ayudarían a aclarar la respuesta a la pregunta principal.
me encontré con esto como una respuesta a What's the strangest corner case you've seen in C# or .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
He estado tratando de envolver mi cabeza en torno a por qué las especificaciones del lenguaje C# siquiera permitir esto. Subparte 1. ¿Hay algo que justifique tener este ser modificable? ¿Es todo útil?
Una de las observaciones a esa respuesta era
De CLR a través de C#: La razón por la que hacen esto es porque puede llamar al constructor sin parámetros de una estructura en otra constructor. Si solo desea inicializar un valor de una estructura y desea que los otros valores sean cero/nulo (valor predeterminado), puede escribir public Foo (barra int) {this = new Foo(); specialVar = bar;}. Esto no es eficiente y no está realmente justificado (specialVar se asigna dos veces), pero solo FYI. (Esa es la razón dada en el libro, no sé por qué no deberíamos hacer pública Foo (barra int): este())
Sub-parte 2. No estoy Seguro que sigo ese razonamiento. ¿Alguien puede aclarar a qué se refería? ¿Tal vez un ejemplo concreto de cómo se usaría?
EDITAR (El punto principal de la pila o el montón de desaprobación es la liberación de memoria o la recolección de basura.) En lugar de la int [] se puede reemplazar eso con 262144 campos públicos públicos) También entendí que las estructuras se crean en la pila en oposición a la pila si esta estructura fuera a tener un campo de matriz de bytes 1 Mb inicializa como así
public int[] Mb = new int[262144];
Sub-parte 3. tiene esto nunca se eliminan de la pila cuando se llama Foo? Para mí, parece que como la estructura nunca salió de su alcance, no se eliminaría de la pila. No tengo tiempo esta noche para crear un caso de prueba, pero tal vez lo haga para este mañana.
En el código de abajo
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
Sub-parte 4. ¿Están t1 y tPlaceHolder ocupando el mismo o diferente espacio de direcciones?
Perdón por tener una publicación de 3 años, pero esta me ha sacado la cabeza.
FYI primera pregunta en stackoverflow por lo que si tengo algo mal con la pregunta amablemente publique un comentario y voy a editar.
Después de 2 días pondré una recompensa de 50 en esta pregunta, incluso si ya tengo un ganador en mente, ya que creo que la respuesta requerirá una cantidad razonable de trabajo para explicar las preguntas.
4 preguntas en 1 no son apropiadas para Desbordamiento de pila. Una pregunta * debe ser una pregunta. * –
@AnthonyPegram - En este caso, creo que es aceptable, ya que estas preguntas son preguntas secundarias sobre cómo funcionan realmente las estructuras – Polity
Mis disculpas no estoy seguro de cómo convertir todo en una. La pregunta principal que supongo se puede resumir por ¿cuáles son los efectos secundarios de permitir que esta palabra clave se modifique? Las preguntas 3-4 son efectos secundarios que pensé que podrían ser una posibilidad. Si alguien tiene poder para editar una pregunta además de mí y cree que pueden preguntarla mejor, siéntase libre de hacerlo. O deje un comentario sugiriendo una mejor pregunta y comenzaré de cero. –