3 Stimmen

c# pass by value

Ich möchte nur folgendes Beispiel anführen:

public void main()
{

   int x = 1;

   Foo(x);
}

public void Foo(int y)
{
    y = 5;
}

Wir wissen, dass C#-Argumente bei Werttypen als Wert übergeben werden. Bedeutet dies im obigen Beispiel, dass ich 2 Kopien auf dem Stack habe, eine für x und eine für y?

14voto

Jon Skeet Punkte 1325502

Ja, es werden zwei unabhängige Variablen auf dem Stapel liegen. Sie befinden sich auch in zwei verschiedenen Stapelrahmen - einer für main und eine für foo (unter der Annahme, dass kein Inlining stattfindet). Wenn Foo zurückgibt, wird der Wert von x ist immer noch 1, nicht 5.

In der Tat sind die Argumente つねに wird in C# standardmäßig als Wert übergeben, sowohl für Referenztypen als auch für Werttypen. Der einzige Unterschied besteht darin, dass bei Referenztypen der Argumentwert es eine Referenz - nicht das Objekt selbst.

Siehe meine Artikel zur Parameterübergabe für viele weitere Details zu diesem Thema.

Beachten Sie, dass das tatsächliche Verhalten dessen, was auf den Stapel kommt, eine Umsetzungsdetails Der C#-Compiler muss dafür sorgen, dass sich ein Programm so verhält, wie es in der Spezifikation festgelegt ist, aber das schreibt kein Stack- oder Heap-Verhalten vor. Also x fait am Ende des Codes den Wert 1 haben, aber ein gültiger C#-Compiler könnte haben beide x y y auf dem Haufen.

4voto

Oded Punkte 475566

Sie verstehen richtig - der Wert für x wird auf dem Stapel im Stapelrahmen für die main Funktion und der Wert für y wird auf dem Stapel im Stapelrahmen für Foo .

1voto

Für weitere Einzelheiten müssen Sie auch verstehen, wie Wertparameter übergeben werden. Der Grund dafür, dass y in Foo keine Auswirkungen auf x in Main hat, ist, dass sie sich in unterschiedlichen Stack Frames befinden. Weitere Einzelheiten zur Übergabe von Wertparametern sind HIER .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X