Las estructuras y los campos desnudos facilitarán la interoperabilidad con algunas API no administradas. A menudo encontrará que la API de bajo nivel desea acceder a los valores por referencia, lo que es bueno para el rendimiento (ya que evitamos una copia innecesaria). El uso de propiedades es un obstáculo para eso y, a menudo, las bibliotecas de contenedor harán copias para facilitar su uso y, a veces, por seguridad.
Debido a eso, a menudo obtendrá un mejor rendimiento con tipos de vectores y matrices que no tienen propiedades sino campos desnudos.
Las mejores prácticas no se están creando en el vacío. A pesar de cierto culto a la carga, en general las mejores prácticas existen por una buena razón.
En este caso, tenemos un par:
Una propiedad le permite cambiar la implementación sin cambiar el código del cliente (a nivel binario, es posible cambiar un campo a una propiedad sin cambiar el código del cliente a nivel fuente, sin embargo, se compilará en algo diferente después del cambio) . Eso significa que, al usar una propiedad desde el principio, el código que hace referencia al suyo no tendrá que volver a compilarse solo para cambiar lo que la propiedad hace internamente.
Si no todos los valores posibles de los campos de su tipo son estados válidos, entonces no desea exponerlos al código del cliente para que el código lo modifique. Por lo tanto, si algunas combinaciones de valores no son válidas, desea mantener los campos privados (o internos).
He estado diciendo el código del cliente. Eso significa código que llama al tuyo. Si no está creando una biblioteca (o incluso está creando una biblioteca pero está usando una función interna en lugar de una pública), generalmente puede salirse con la suya y tener buena disciplina. En esa situación, la mejor práctica de usar propiedades es evitar que te dispares en el pie. Además, es mucho más fácil razonar sobre el código si puede ver todos los lugares donde un campo puede cambiar en un solo archivo, en lugar de tener que preocuparse por lo que sea que esté siendo modificado o no en otro lugar. De hecho, las propiedades también son buenas para poner puntos de interrupción cuando se da cuenta de lo que salió mal.
Sí, hay valor en ver lo que se está haciendo en la industria. Sin embargo, ¿tiene una motivación para ir en contra de las mejores prácticas? ¿O simplemente va en contra de las mejores prácticas, haciendo que el código sea más difícil de razonar, simplemente porque alguien más lo hizo? Ah, por cierto, "otros lo hacen" es cómo iniciar un culto de carga.
Entonces ... ¿Tu juego corre lento? Es mejor dedicar tiempo a descubrir el cuello de botella y arreglarlo, en lugar de especular sobre lo que podría ser. Puede estar seguro de que el compilador hará muchas optimizaciones, debido a eso, es probable que esté buscando el problema incorrecto.
Por otro lado, si está decidiendo qué hacer para comenzar, debe preocuparse por los algoritmos y las estructuras de datos primero, en lugar de preocuparse por detalles más pequeños, como los campos frente a las propiedades.
Finalmente, ¿ganas algo al ir en contra de las mejores prácticas?
Para los detalles de su caso (Unity y Mono para Android), ¿Unity toma los valores por referencia? Si no lo hace, copiará los valores de todos modos, no habrá ganancia de rendimiento allí.
Si lo hace, si está pasando estos datos a una API que toma ref. ¿Tiene sentido hacer público el campo, o podría hacer que el tipo pueda llamar a la API directamente?
Sí, por supuesto, podría haber optimizaciones que podría hacer mediante el uso de estructuras con campos desnudos. Por ejemplo, puede acceder a ellos con punteros Span<T>
o similar. También son compactos en memoria, lo que facilita su serialización para enviarlos a través de la red o almacenarlos permanentemente (y sí, esas son copias).
Ahora, si ha elegido los algoritmos y estructuras correctos, si resultan ser un cuello de botella, entonces decide cuál es la mejor manera de solucionarlo ... que podrían ser estructuras con campos desnudos o no. Podrá preocuparse por eso si y cuando suceda. Mientras tanto, puede preocuparse por asuntos más importantes como hacer que un juego bueno o divertido valga la pena.