Eine einfache Frage, aber ich habe keine definitive Antwort auf Stack Overflow gefunden.Ist eine C# -Struktur jemals eingerahmt, wenn sie als Rückgabewert einer Funktion verwendet wird?
struct foo { int x; int y; int z; }
foo Func()
{
return new foo();
}
void Func2()
{
foo f = Func(); // did boxing and unboxing occur?
}
Ist ein C# struct (Werttyp) immer auf den Stack kopiert, wenn sie von einer Funktion zurückgegeben, egal wie groß es sein könnte? Der Grund, warum ich unsicher bin, ist, dass für einige Befehlssätze außer MSIL (wie x86) ein Rückgabewert normalerweise in ein Prozessorregister passen muss und der Stapel nicht direkt involviert ist.
Wenn ja, ist es die Aufruf-Site, die Speicherplatz auf dem CLR-Stapel für den (erwarteten) Rückgabewert-Typ reserviert?
[edit: Zusammenfassung der Antworten:] Für die Absicht der ursprünglichen Frage ist die Antwort nein; Die CLR wird eine Struktur niemals (still) boxen, nur um sie als Rückgabewert zu senden.
@Brian: danke, das merke ich, aber ich denke, du sagst, dass der Prozess, es von der Funktion selbst zurückzugeben, kein Boxen beinhaltet. Ich habe den Code aktualisiert, um die Frage klarer zu machen. –
Großartig, danke für deine Antworten! –
Wenn eine Rückgabe eines Werttyps immer vorhanden ist (Ihre Verwendung von 'Ever' scheint manchmal zu bedeuten, dass es nicht bedingungslos ist), bedeutet das implizites Unboxing, wenn wir die Rückgabe einer Werttypvariablen zuweisen. und das scheint ineffizient. Ich weiß nicht viel über MSIL und CLR, also kann ich dir hier nicht helfen. Wie auch immer, kann ich wissen, was deine Frage ausgelöst hat? – blizpasta