Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

09.05.2013, 22:16

"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

De_Struktor

unregistriert

22

11.05.2013, 11:58

Zitat

Zitat von BlueCobbold

Zitat

Genau wegen sowas habe ich gesagt man muss wissen welche Sprache. C# übergibt nahezu nichts by value - nur structs und andere integrale Typen. Daher macht das da NULL Sinn, außer du willst die Arrays per "new" komplett neu zuweisen. Also: Nein, Finger weg von "ref" in diesem Fall. Bei C# sind Referenz-Typen eben genau das: Referenz-Typen, die per Referenz übergeben werden - automatisch und immer! Das "ref" Schlüsselwort hat eine sehr sehr spezielle Bedeutung und sollte daher auch nur dann eingesetzt werden, wenn tatsächlich genau diese Funktionalität benötigt wird. Das ist hier aber nicht der Fall. Die Arrays werden auch ohne "ref" by reference übergeben und die Semantik von "ref" wäre hier schlicht falsch.
Wie dot zudem schon sagte: Bei C++ sollte man Wert darauf legen auch mal etwas by value zu übergeben.



So du sagtest das bei .NET alles, außer primitive Datentypen, mittels Referenz übergeben werden.

Im Falles des Arrays stimme ich dir zu, da diese als Verweistypen in der .NET betrachtet werden.


Aber Rectangle ...


das ist in XNA ein struct, somit würde es also doch Sinn machen, sie als ref zu übergeben, oder nicht.
da Structs in C# Valuetypes sind und nicht automatisch als Verweis übergeben werden, oder nicht??

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »De_Struktor« (11.05.2013, 12:31)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

11.05.2013, 12:36

Wenn das ein struct ist und keine Klasse, dann schon. Dann sollte man sich allerdings fragen, warum Microsoft das als Struct und nicht als Klasse entworfen hat. Die logische Antwort wäre, dass es selbst bei call-by-value keinen Performance-Unterschied gibt oder die by-value-Variante sogar schneller ist als die by-Reference-Version.

Meine Empfehlung bleibt daher: "ref" in C# nur dort benutzen, wo tatsächlich ein Parameter in einer Methode geändert werden soll. Alles andere ist premature optimization.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (11.05.2013, 14:05)


De_Struktor

unregistriert

24

11.05.2013, 12:39

okk...

De_Struktor

unregistriert

25

11.05.2013, 12:43

okk... es wurde aus meiner Sicht als Struct definiert, da es nicht so speicherintensiv wäre wie eine Klasse für die kümmerliche Anzahl an Elementen der Struktur. Oder was meint ihr, gebe es noch andere signifikante Merkmale???

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

26

11.05.2013, 12:49

Woher die Information, dass ein Struct in C# weniger speicherintensiv ist als eine Klasse?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

De_Struktor

unregistriert

27

11.05.2013, 12:54

edit:


war doch richtig, aber dachte das sie in C# S-schonender wären, uppsi, fehlinformation

edit: und wieso sie dann ein struct statt class benutzt haben ist mir dann ein Rätsel?!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »De_Struktor« (11.05.2013, 13:01)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

28

11.05.2013, 13:38



Wenn das ein struct ist und keine Klasse, dann schon. Dann sollte man sich allerdings fragen, warum Microsoft das als Struct und nicht als Klasse entworfen hat. Die logische Antwort wäre, dass es selbst bei call-by-value keinen Performance-Unterschied gibt oder die by-value-Variante sogar schneller ist als die by-Reference-Version.

Meine Empfehlung bleibt daher: "ref" in C# nur dort benutzen, wo tatsächlich ein Parameter in einer Methode geändert werden soll. Alles andere ist immature optimization.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Tobiking

1x Rätselkönig

  • Private Nachricht senden

29

11.05.2013, 14:02

Ich denke das Call-by-value ist nicht der Grund warum man Structs verwendet, sondern eine Folge des eigentlichen Grunds. Der Unterschied zwischen Klasse und Struct ist, dass Structs auf dem Stack erzeugt werden, während Klassen auf dem Heap landen. Entsprechend ist die Lebenszeit des Struct an den Scope gebunden in dem es erzeugt wurde. Sobald dieser Scope verlassen wird, wird das Struct zerstört. Eine weitergegebene Referenz ist aber unabhängig von dem Scope und könnte dann auf das nicht existierende Struct zeigen. Deswegen erzeugt man bei der Weitergabe eine Kopie statt zu referenzieren.

Ich bin nicht sicher wie das geregelt ist, wenn explizit eine Referenz übergeben wird. Vermutlich wird das aber vom Compiler schon erkannt und das Struct doch nicht auf dem Stack erzeugt. Das wäre ein Beispiel dafür das unnötiges ref sogar schädlich für die Performanz sein kann.

Und der Grund warum man Stack verwendet ist einfach Geschwindigkeit. Es ist z.B. keine spezielle Verwaltung der Lebenszeit nötig.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

30

11.05.2013, 14:09

Das hängt halt alles miteinander zusammen. Wenn man mal C++ programmiert dann bekommt man damit noch ein wenig mehr zu tun.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige