La domanda principale è quali sono le implicazioni di consentire che questa parola chiave venga modificata in termini di utilità e memoria; e perché è consentito nelle specifiche del linguaggio C#?Assegnare questa parola chiave in C#
Le altre domande/sottoparti possono essere risposte o meno se si sceglie di farlo. Pensavo che le risposte a loro avrebbero aiutato a chiarire la risposta alla domanda principale.
mi sono imbattuto in questo come una risposta a What's the strangest corner case you've seen in C# or .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
Ho cercato di avvolgere la mia testa intorno perché le specifiche del linguaggio C# sarebbe nemmeno permettere questo. Sottotitolo 1. c'è qualcosa che giustificherebbe che questo sia modificabile? È tutto utile?
Uno dei commenti a questa risposta era
Da CLR via C#: La ragione per cui hanno fatto questo è perché si possibile chiamare il costruttore senza parametri di una struttura in un altro costruttore. Se vuoi solo inizializzare un valore di una struct e vuoi che gli altri valori siano zero/null (default), puoi scrivere public Foo (int bar) {this = new Foo(); specialVar = bar;}. Questo non è efficiente e non molto giustificato (specialeVar viene assegnato due volte), ma solo FYI. (Questo è il motivo addotto nel libro, non so il motivo per cui non dovremmo solo fare pubblica Foo (int bar): questo())
Sotto-parte 2. io non sono certo seguo questo ragionamento Qualcuno può chiarire cosa intendeva? Forse un esempio concreto di come sarebbe usato?
EDIT (Ignora stack o heap main point è relativo alla liberazione di memoria o alla garbage collection. Invece di int [] è possibile sostituirlo con 262144 campi pubblici int) Anche dalle mie strutture di comprensione vengono create nello stack come opposto al mucchio se questa struct dovesse avere un campo matrice di byte 1 Mb inizializzato come così
public int[] Mb = new int[262144];
Sotto-parte 3. vuol mai vengono rimossi dallo stack quando viene chiamato Foo? A me sembra che, dal momento che la struttura non è mai stata fuori portata, non sarebbe stata rimossa dallo stack. Non ho tempo stasera per creare un caso di prova, ma forse lo farò domani.
Nel codice qui sotto
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
Sotto-parte 4. T1 e tPlaceHolder occupano lo stesso spazio indirizzo o diverso?
Mi spiace far apparire un post di 3 anni, ma questo mi ha davvero graffiato la testa.
FYI prima domanda su stackoverflow quindi se ho qualcosa di sbagliato con la domanda gentilmente postare un commento e modifico.
Dopo 2 giorni metterò una taglia di 50 su questa domanda, anche se ho già scelto un vincitore nella mia mente come penso che la risposta richiederà una quantità ragionevole di lavoro per spiegare le domande.
4 domande in 1 non sono appropriate per Stack Overflow. Una domanda * dovrebbe essere una domanda. * –
@AnthonyPegram - In questo caso penso sia accettabile dal momento che queste domande sono domande secondarie rispetto alla domanda principale, ovvero come funzionano veramente le strutture – Polity
Le mie scuse non sono sicuro di come riformulare tutto in una sola. La domanda principale, suppongo, può essere riassunta da quali sono gli effetti collaterali di consentire la modifica di questa parola chiave? Le domande 3-4 sono effetti collaterali che pensavo potessero essere una possibilità. Se qualcuno ha il potere di modificare la domanda oltre a me e pensa di poterlo chiedere meglio, sentiti libero di farlo. Oppure lascia un commento suggerendo una domanda migliore e inizierò da zero. –