Strukturen und nackte Felder erleichtern die Interoperabilität mit einigen nicht verwalteten APIs. Oft werden Sie feststellen, dass die Low-Level-API auf die Werte über Verweise zugreifen möchte, was der Leistung zuträglich ist (da wir eine unnötige Kopie vermeiden). Die Verwendung von Eigenschaften ist ein Hindernis dafür, und häufig werden von den Wrapperbibliotheken Kopien erstellt, um die Verwendung zu vereinfachen und manchmal um die Sicherheit zu gewährleisten.
Aus diesem Grund erzielen Sie häufig eine bessere Leistung mit Vektor- und Matrixtypen, die keine Eigenschaften, aber nackte Felder aufweisen.
Best Practices werden nicht im Vakuum erstellt. Trotz eines gewissen Frachtkults gibt es im Allgemeinen Best Practices aus gutem Grund.
In diesem Fall haben wir ein paar:
Mit einer Eigenschaft können Sie die Implementierung ändern, ohne den Client-Code zu ändern. (Auf einer Binär-Ebene ist es möglich, ein Feld in eine Eigenschaft zu ändern, ohne den Client-Code auf einer Quell-Ebene zu ändern. Es wird jedoch nach der Änderung zu etwas anderem kompiliert.) . Das bedeutet, dass durch die Verwendung einer Eigenschaft von Anfang an der Code, der auf Ihre verweist, nicht neu kompiliert werden muss, nur um zu ändern, was die Eigenschaft intern tut.
Wenn nicht alle möglichen Werte der Felder Ihres Typs gültige Zustände sind, möchten Sie sie nicht dem Client-Code aussetzen, der sie modifiziert. Wenn also einige Wertekombinationen ungültig sind, möchten Sie die Felder privat (oder intern) halten.
Ich habe Client-Code gesagt. Das bedeutet Code, der in Ihren aufruft. Wenn Sie keine Bibliothek erstellen (oder sogar eine Bibliothek erstellen, aber intern statt öffentlich verwenden), können Sie in der Regel mit dieser und einer guten Disziplin davonkommen. In dieser Situation sollten Sie am besten Eigenschaften verwenden, um zu verhindern, dass Sie sich in den Fuß schießen. Darüber hinaus ist es viel einfacher, über Code nachzudenken, wenn Sie alle Stellen sehen, an denen sich ein Feld in einer einzigen Datei ändern kann, anstatt sich darum kümmern zu müssen, ob es an einer anderen Stelle geändert wird oder nicht. In der Tat sind Eigenschaften auch gut, um Haltepunkte zu setzen, wenn Sie herausfinden, was schief gelaufen ist.
Ja, es ist wertvoll zu sehen, was in der Industrie getan wird. Haben Sie jedoch eine Motivation, sich gegen die Best Practices zu wenden? Oder widersetzen Sie sich nur den bewährten Methoden - machen Sie es schwieriger, über den Code nachzudenken - nur weil es jemand anderes getan hat? Übrigens: "Andere tun es", so beginnt ein Frachtkult.
Also ... Läuft dein Spiel langsam? Sie sollten lieber Zeit investieren, um den Engpass herauszufinden und diesen zu beheben, anstatt zu spekulieren, woran es liegen könnte. Sie können sicher sein, dass der Compiler viele Optimierungen vornimmt. Aus diesem Grund suchen Sie wahrscheinlich das falsche Problem.
Auf der anderen Seite sollten Sie sich zunächst überlegen, welche Algorithmen und Datenstrukturen verwendet werden sollen, anstatt sich um kleinere Details wie Felder oder Eigenschaften zu kümmern.
Verdienen Sie etwas, indem Sie gegen Best Practices verstoßen?
Nimmt Unity für die Details Ihres Falls (Unity und Mono für Android) Werte als Referenz? Wenn dies nicht der Fall ist, werden die Werte trotzdem kopiert, und es wird kein Leistungsgewinn erzielt.
Wenn dies der Fall ist, übergeben Sie diese Daten an eine API, die ref. Ist es sinnvoll, das Feld öffentlich zu machen, oder kann der Typ die API direkt aufrufen?
Ja, natürlich gibt es Optimierungen, die Sie mithilfe von Strukturen mit nackten Feldern vornehmen können. Beispielsweise greifen Sie mit Zeigern darauf zu Span<T>
oder ähnlichem darauf zu. Sie haben auch einen kompakten Speicher, sodass sie einfach zu serialisieren sind, um über das Netzwerk gesendet oder dauerhaft gespeichert zu werden (und ja, das sind Kopien).
Haben Sie nun die richtigen Algorithmen und Strukturen ausgewählt, und wenn sich herausstellt, dass sie ein Engpass sind, entscheiden Sie, wie Sie das Problem am besten beheben können. Dies können Strukturen mit nackten Feldern sein oder nicht. Sie können sich darüber Gedanken machen, wenn es passiert. In der Zwischenzeit können Sie sich um wichtigere Dinge kümmern, z. B. ein gutes oder unterhaltsames Spiel zu spielen.