Im Allgemeinen für C # und speziell für Unity würde ich davon abraten ... aber wenn Sie wirklich wollten oder guten Grund hatten, könnten Sie.
In C # müssten Sie sich mit dem so genannten unsicheren Code vertraut machen . Noch Angst?
In Unity müssten Sie den unsicheren Kompilierungsmodus aktivieren, damit Sie den Web-Player nicht verwenden können, wenn Sie dies geplant haben. Sie können hier oder hier mehr lesen .
Also im Grunde C # wurde mit einem entworfen Garbage Collector so viele Skriptsprachen sind. Die allgemeine Idee besteht darin, den Begriff der Speicherverwaltung zu abstrahieren, um die Entwicklung zu vereinfachen. Es kann immer noch zu Ressourcenlecks kommen, wenn Sie Ihre Objekte nicht aufheben. Ich bin ehrlich gesagt kein großer Befürworter von GCs und würde stattdessen RAII- Methoden bevorzugen , aber dies ist die Welt, in der wir leben.
Die meisten C ++ - Entwickler würden jedoch auch zustimmen, dass Sie Zeiger sowieso nicht direkt verwenden sollten und es vorziehen sollten, einen von RAII entworfenen Typ, auch bekannt als intelligente Zeiger, zu verwenden . Wenn Sie sich in C-Land befinden, sind Zeiger für Sie wahrscheinlich eine Selbstverständlichkeit, aber selbst dann hilft es, sie bis zu einem gewissen Grad zu abstrahieren.
Wenn Sie sie in C # verwenden, beachten Sie nur, dass es ein sehr reales Potenzial gibt, dass Sie Sicherheitslücken hinzufügen oder wirklich böse und schwer zu lokalisierende Fehler finden können. Sie müssen auch berücksichtigen, dass Sie darauf achten müssen, keine Objekte zu referenzieren, die vom GC verschoben werden können. Beachten Sie die Verwendung der festen Aussage hier .
Sie können Zeiger auch in Unity verwenden, indem Sie ein natives Plugin schreiben . Dies schließt Webplayer-Builds erneut aus, aber die neue HTML5-Funktion basiert auf emscripten. Wenn Sie dies verwenden möchten , können Sie dies wahrscheinlich tun , wenn Sie vorsichtig sind. Mit nativen Plugins können Sie Unity plattformübergreifend erweitern. Ich habe ein natives Plugin geschrieben, um beispielsweise über eine serielle Verbindung mit einigen Mikrocontrollern zu kommunizieren.
Zusammenfassend sollten Sie sich also auf jeden Fall fragen, warum ich in Unity Zeiger in C # verwenden möchte. Wenn du es nur zum Spaß machen willst ... Knock dich aus.
Edit:
Es tut mir leid, wenn ich jemanden beleidigt habe, da ich weiß, dass meine Gedanken zu GC momentan nicht der populären Meinung sind.
Wenn Sie meine Antwort wirklich lesen, werden Sie feststellen, dass ich C # nicht als Skriptsprache bezeichne. Ich vergleiche es mit "vielen Skriptsprachen", aber im Kontext von Unity wird es sehr häufig als Skriptsprache verwendet. Es ist eine Art DSL für Unity, wenn Sie so wollen. Oft wird es in diesem Zusammenhang sogar als Unity-Skript bezeichnet (dies bezieht sich hauptsächlich auf die Javascript-Alternative von Unity zu C #). Wenn Sie LLVM in Ihre Pipeline aufnehmen, können Sie es einfach direkt in nativen Code für die Plattform kompilieren ... wie würden Sie es dann nennen? Also wollte ich hier wirklich keine Haare spalten.
Viele großartige Referenzen zum Software-Engineering sind mit Meinungen gefüllt:
Effektives C ++ ,
effektiveres C ++ , häufig gestellte
Fragen zu C ++ ,
effektives C # ,
modernes C ++ - Design ,
Designmuster
... und unzählige andere. Ich glaube nicht, dass dies die Argumente weniger glaubwürdig macht, wenn ihnen eine nachdenkliche Erklärung folgt.
Ich habe nicht wirklich alles gesagt "Benutze niemals Zeiger !!" . Tatsächlich benutze ich sie gelegentlich immer noch nackt. Ich sagte "im Allgemeinen" wie in "Verwenden Sie lieber sicheren Code als unsicheren Code in C #". Es gibt Situationen, in denen dies von Vorteil sein kann, und dies ist eine der wirklich leistungsstarken Funktionen von C #, um Ihre Werkzeuge auszuwählen. Mit C # können Sie sogar bis zu einem gewissen Grad Transparenz im GC-Prozess haben, Sprachen wie Dart nicht und dies kann sehr leicht zu Ressourcenlecks führen. Sicher, wenn Sie der einzige Entwickler eines kleinen Projekts sind, ist dies wahrscheinlich kein Problem. Wenn Sie in einem Team von beispielsweise 10+ mit Hunderttausenden von Codezeilen arbeiten, kann dies schwierig werden.
Ich wollte einfach, dass der Leser Vorsicht walten lässt, wenn er nackte Zeiger verwendet. Es ist fast so, als würde man sehr vorsichtig sein, wenn man mit Netzstrom arbeitet. Ich sage nicht, dass Sie kein Elektriker sind, nur dass Sie tot sind, wenn Sie den falschen Schritt machen und ihn nicht mit Respekt behandeln.
Ich mag das Beispiel von Lasse, in dem die Leistung die Notwendigkeit diktiert haben könnte.
C # verwendet Verweise , um Objekte weiterzugeben, die keine Werttypen sind . Dies bedeutet, dass normalerweise alles als Referenz übergeben wird. Wenn Sie einen Werttyp als Referenz übergeben möchten, können Sie das Schlüsselwort ref verwenden . Der Unterschied zwischen einem Referenztyp und einem Werttyp besteht darin, dass abhängig von der Größe des Werttyps normalerweise mehr Speicher benötigt wird, wenn er an eine Funktion übergeben wird. Eine Referenz ist nur 32 Bit oder 64 Bit oder 4 Bytes oder 8 Bytes. Sie können mehr Leistung aus Ihrem Code in sehr engen Schleifen herausholen, wenn Sie Referenzen verwenden, anstatt nur alle Daten zu kopieren, die die werttypisierten Variablen enthalten, vorausgesetzt, sie sind größer als 4 oder 8 Bytes.
In Unity ist beispielsweise jedes MonoBehaviour-Objekt (Klassenobjekt) ein Referenztyp, und jedes Vector3-Objekt (Strukturobjekt) ist ein Werttyp.
Es gibt auch unsichere Codeblöcke , mit denen Sie Code eingeben können, mit dem Sie Daten unsicher erstellen und ändern können. Um unsicheren Code zu verwenden, müssen Sie den Compiler so einstellen, dass unsicherer Code zugelassen wird. Zeiger können auf diese Weise verwendet werden. Durch die Verwendung von unsicherem Code werden bestimmte Prüfungen mit sicherem Code nicht verwendet, wodurch es schwieriger wird, unsicheren Code fehlerfrei zu schreiben. Es gibt nur sehr wenige Orte , die von unsicherem Code in C # profitieren können. Unter Unity wird unsicherer Code nicht auf allen Plattformen unterstützt. Normalerweise reicht es aus, Referenzen anstelle unsicherer Zeiger zu verwenden, wenn Sie mit Unity arbeiten.
Hier ist ein Beispiel ( Quelle ) für die Verwendung unsicherer Codezeiger in C # mit Unity:
quelle