Fragen zu Parameterübergabe in C#
-
Hi Leutz!
ich bin von C++ zu C# umgestiegen und habe nun ein paar Fragen zur Parameterübergabe.
1. Frage:public void initialize(Device device) { mesh = Mesh.Box(device,1.0f,1.0f,1.0f); }
Wird im oben genannten Code jetzt der copy Konstruktor aufgerufen und eine lokale Kopie erstellt?
2.Frage:
class Ball { private Device device; public Ball(Device dev) { device = dev; } public void initialize() { device.Transform.World = Matrix.Translation(...); } }
Wirken sich so die Änderungen aufs original Device aus?
3. Frage (Properties)
code wie oben jedoch z.B:public void initialize() { device.Transform.Projection.M44 = 1.0f; }
Warum kann ich den Wert so nicht ändern?
Fehlermeldung:Error 1 Cannot modify the return value of 'Microsoft.DirectX.Direct3D.Transforms.Projection' because it is not a variable
danke im voraus
-
C#GameCoder schrieb:
Hi Leutz!
ich bin von C++ zu C# umgestiegen und habe nun ein paar Fragen zur Parameterübergabe.
1. Frage:public void initialize(Device device) { mesh = Mesh.Box(device,1.0f,1.0f,1.0f); }
Wird im oben genannten Code jetzt der copy Konstruktor aufgerufen und eine lokale Kopie erstellt?
Nein. Es wird lediglich ein Zeiger übergeben, da standardmäßig in C# by value übergeben wird. Übertragen auf C++ würde die Methode so aussehen:
initialize(Device *device) { ... }2.Frage:
class Ball { private Device device; public Ball(Device dev) { device = dev; } public void initialize() { device.Transform.World = Matrix.Translation(...); } }
Wirken sich so die Änderungen aufs original Device aus?
Ja. Begründung siehe oben.
3. Frage (Properties)
code wie oben jedoch z.B:public void initialize() { device.Transform.Projection.M44 = 1.0f; }
Warum kann ich den Wert so nicht ändern?
Fehlermeldung:Error 1 Cannot modify the return value of 'Microsoft.DirectX.Direct3D.Transforms.Projection' because it is not a variable
In Kurzform: Da Projection vom Typ Matrix ist und Matrix ein Value Type ist (struct). Dadurch würde sich die Zuweisung nicht auswirken. Genaue Erklärung:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cscomp/html/vcerrCompilerErrorCS1612.aspUm also eine Komponente der Matrix zu setzen könntest du schreiben:
Matrix m = device.Transform.Projection; m.M44 = 1.0f;
-
erstmal danke für die Antwort.
interpreter schrieb:
Es wird lediglich ein Zeiger übergeben, da standardmäßig in C# by value übergeben wird.
Ich dachte bei Call by Value wird immer das Objekt kopiert. Wenn das in C# standardmäßig eingesetzt wird, warum wird dann an der Stelle ein Zeiger übergeben?
-
Achja, für was braucht man dann das ref Schlüsselwort?
-
C#GameCoder schrieb:
Achja, für was braucht man dann das ref Schlüsselwort?
Für Value Datentypen.
-
C#GameCoder schrieb:
erstmal danke für die Antwort.
interpreter schrieb:
Es wird lediglich ein Zeiger übergeben, da standardmäßig in C# by value übergeben wird.
Ich dachte bei Call by Value wird immer das Objekt kopiert. Wenn das in C# standardmäßig eingesetzt wird, warum wird dann an der Stelle ein Zeiger übergeben?
Weil dein Device ein Klassen-Typ ist. Das device ist einfach nur ein Zeiger auf das eigentliche Device, das ist in C# bei allen Klasseninstanzen so. Der Zeiger wird allerdings by value übergeben. Falls du also den Zeiger in deiner Funktion auf ein anderes Objekt zeigen lässt, ist er nach außen hin unverändert und zeigt noch auf das selbe Objekt.
C#GameCoder schrieb:
Achja, für was braucht man dann das ref Schlüsselwort?
Wenn du z.B. den Zeiger in der Funktion neu zuweisen willst und er soll danach auch wirklich woanders hinzeigen. ref übergibt alles als Referenz, auch die Zeiger auf Klassen-Instanzen.
-
Wenn du aus der C++ Ecke kommst, sollte dir die Bedeutung von ref eigentlich sofort klar sein. ref entspricht in C++ dem "&" in Methodensignaturen.