En general, para C # y específicamente para Unity, le recomendaría que no lo haga ... pero si realmente quisiera o tuviera una buena razón, podría hacerlo.
En C # necesitaría familiarizarse con lo que se llama código inseguro . ¿Asustado todavía?
En Unity, deberías habilitar el modo de compilación inseguro para que no puedas usar el reproductor web si planeaste eso. Puedes leer más aquí o aquí .
Básicamente, C # se diseñó con un recolector de basura como lo son muchos lenguajes de secuencias de comandos. La idea general es tratar de abstraer la noción de gestión de memoria para simplificar el desarrollo. Todavía puede terminar con pérdidas de recursos si no anula sus objetos. Sinceramente, no soy un gran defensor de los GC y preferiría los métodos RAII , pero este es el mundo en el que vivimos.
Sin embargo, la mayoría de los desarrolladores de C ++ también estarían de acuerdo en que no debería usar punteros directamente de todos modos y preferiría usar un tipo diseñado por RAII, también conocido como punteros inteligentes . Si estás en tierra C, entonces los punteros probables son una segunda naturaleza para ti, pero incluso así, es útil abstraerlos hasta cierto punto.
Si los usa en C #, tenga en cuenta que existe un potencial muy real que podría agregar vulnerabilidades de seguridad o errores realmente desagradables y difíciles de rastrear. También deberá tener en cuenta que debe tener cuidado de no hacer referencia a objetos que el GC pueda mover. Tenga en cuenta el uso de la declaración fija aquí .
También puede usar Punteros en Unity escribiendo un complemento nativo . Esto nuevamente descartará las compilaciones de jugadores web, pero la nueva función HTML5 funciona basada en emscripten, por lo que si planea usar eso, probablemente podría hacerlo si tiene cuidado. Los complementos nativos le permiten extender Unity por plataforma. Escribí un complemento nativo para comunicarse con algunos microcontroladores a través de una conexión en serie, por ejemplo.
Entonces, para resumir, definitivamente debe preguntarse por qué quiero usar punteros en C # en Unity. Si solo quieres hacerlo por diversión ... Déjate llevar.
Editar:
Lamento haber ofendido a alguien, ya que sé que mis pensamientos sobre GC no son de la opinión popular en este momento.
Si realmente lee mi respuesta, notará que no llamo a C # un lenguaje de script. Lo comparo con "muchos lenguajes de secuencias de comandos", sin embargo, en el contexto de Unity se usa mucho como lenguaje de secuencias de comandos. Es algo así como un DSL para Unity, por así decirlo. Muchas veces lo verá incluso denominado Unity Script en este contexto (esto es principalmente en referencia a la alternativa Javascript de Unity a C #). Si pones LLVM en tu canalización, puedes compilarlo en código nativo para la plataforma directamente ... ¿cómo lo llamarías? Así que realmente no quería dividir los pelos aquí.
Muchas grandes referencias a la ingeniería de software están llenas de opiniones:
Efectiva C ++ ,
más eficaz C ++ ,
C ++ FAQ ,
efectiva C # ,
moderno diseño de C ++ ,
patrones de diseño
... Y muchos otros. No creo que esto haga que los argumentos sean menos creíbles si van seguidos de una explicación reflexiva.
Realmente no estaba del todo diciendo "¡No uses punteros nunca!" . De hecho, todavía los uso desnudos en ocasiones. Dije "en general" como en "prefiero usar código seguro a código inseguro en C #". Hay situaciones en las que puede ser beneficioso, y esa es una de las características realmente poderosas de C # para elegir y elegir sus herramientas. C # incluso le permite tener transparencia en el proceso de GC hasta cierto punto, los lenguajes como Dart no lo hacen y pueden provocar pérdidas de recursos con mucha facilidad. Claro, si usted es el único desarrollador de un pequeño proyecto, probablemente no sea un problema. Si está en un equipo de digamos 10+ con cientos de miles de líneas de código, entonces puede ser complicado.
Simplemente quería que el lector tuviera precaución al usar punteros desnudos. Es similar a decir que tenga mucho cuidado cuando trabaje con la red eléctrica. No digo que no seas electricista, solo que si haces el movimiento equivocado y no lo tratas con respeto, estás muerto.
Me gusta el ejemplo dado por Lasse en el que el rendimiento puede haber dictado la necesidad.
C # usa referencias para pasar objetos que no son tipos de valor . Esto significa que todo generalmente se pasa por referencia. Si desea pasar un tipo de valor por referencia, puede usar la palabra clave ref . La diferencia entre un tipo de referencia y un tipo de valor es que, dependiendo de qué tan grande sea el tipo de valor, generalmente requiere más memoria copiada cuando se pasa a una función. Una referencia es solo 32 bits o 64 bits , o 4 bytes u 8 bytes. Puede obtener más rendimiento de su código en bucles muy ajustados si usa referencias en lugar de simplemente copiar todos los datos que contienen las variables de tipo de valor, suponiendo que sean mayores de 4 u 8 bytes.
Por ejemplo, en Unity, cualquier objeto MonoBehaviour (clase) es un tipo de referencia, y cualquier objeto Vector3 (estructura) es un tipo Value.
También hay bloques de código inseguro que le permitirán escribir código que le permite crear y modificar datos de manera insegura. Para usar código inseguro, deberá configurar el compilador para permitir el código inseguro. Los punteros se pueden usar de esta manera. Al usar código inseguro, no se utilizan ciertas comprobaciones que están allí con código seguro, lo que hace que el código inseguro sea más difícil de escribir sin errores. Hay muy pocos lugares que puedan beneficiarse del código inseguro en C #. En Unity, el código inseguro no es compatible con todas las plataformas. Por lo general, usar referencias en lugar de punteros inseguros es suficiente cuando se trabaja con Unity.
Aquí hay un ejemplo ( fuente ) del uso de punteros de código inseguros en C # con Unity:
fuente