2010-05-03 15 views
9

Lea this question hoy sobre código seguro e inseguro. Luego lo leí en MSDN pero todavía no lo entiendo. ¿Por qué querrías usar punteros en C#? ¿Esto es puramente por velocidad?Código seguro contra inseguro

+15

Si es una persona sensata, nunca * quiera * utilizar punteros en C#. Están ahí para aquellas situaciones en las que * tienes * que usar punteros en C#, ya sea que * quieras * o no. :-) –

Respuesta

22

Hay tres razones para usar código no seguro:

  • APIs (como se ha señalado por John)
  • obtener la dirección real de la memoria de datos (es decir, hardware asignado a la memoria de acceso)
  • forma más eficiente de acceder y modificar los datos (los requisitos de rendimiento de tiempo crítico)
+6

Para la aplicación de tiempo crítico con .net no es inteligente de todos modos. El GC no es determinista y puede activarse en cualquier momento. Que básicamente arruina tu aplicación de tiempo crítico. Otros puntos estoy de acuerdo por cierto! – Henri

+1

Otra razón que he escuchado mencionar para usar C# inseguro es asegurarme de que la información sensible a la seguridad, como una contraseña o clave de cifrado privada, se elimine de la memoria en un momento determinado. De lo contrario, una contraseña puede quedarse en la memoria hasta que otra persona quiera escribir en las mismas ubicaciones. – harms

+1

También es ocasionalmente útil en proyectos universitarios. –

5

A veces necesitará punteros para conectar su C# al sistema operativo subyacente u otro código nativo. Está muy desalentado de hacerlo, ya que es "inseguro" (natch).

Habrá algunas ocasiones muy raras en las que su rendimiento estará tan ligado a la CPU que necesitará ese minúsculo rendimiento adicional. Mi recomendación sería escribir esas piezas incautadas a la CPU en un módulo separado en ensamblador o C/C++, exportar una API y hacer que su código .NET llame a esa API. Un posible beneficio adicional es que puede colocar un código específico de la plataforma en el módulo no administrado y dejar la plataforma .NET agnóstica.

+1

¿Por qué recomienda cambiar los idiomas por código sensible al rendimiento? Las ventajas no están del todo claras. ¿Por qué no utilizar todas las funciones del lenguaje C#? –

+0

¿Herramienta correcta para el trabajo correcto? Si voy a buscar con punteros y otros trabajos de bajo nivel, prefiero hacerlo con C/C++, donde tengo muchas herramientas a mi disposición. Cosas útiles como ensamblador en línea, punteros basados ​​y otras cosas de empuje de bits no son compatibles con C#. –

+0

Acepto, al escribir en ensamblador o en C, debe preocuparse por cómo se compiló el código. – ChaosPandion

4

que tienden a evitarlo, pero hay algunas ocasiones en las que es muy útil:

  • para un rendimiento de trabajo con tampones primas (gráficos, etc)
  • necesario para algunas API no administrados (también bastante raro para mí)
  • por hacer trampas con los datos

Por ejemplo de la última, Mantengo algún código de serialización. Escribir un float a una corriente sin tener que utilizar BitConverter.GetBytes (que crea una matriz cada vez) es doloroso - pero puede engañar:

float f = ...; 
int i = *(int*)&f; 

Ahora puede usar el desplazamiento (>>), etc para escribir i mucho más fácilmente que escribir f sería (los bytes serán idénticos a si hubiera llamado BitConverter.GetBytes, además de que ahora controlo el endianness por cómo elijo usar shift).

+3

Entiendo por qué lo haces, pero ese código en C# solo me avergüenza. – Stephan

+0

Solo tuve que reír cuando vi esto: 'por hacer trampa con datos'. ¡Me rompes a mi amigo! No puedo decir que lo haya hecho alguna vez, ¡pero el ejemplo tiene mucho sentido! –

0

Hay al menos una .Net API administrada que a menudo hace que el uso de punteros sea inevitable. Ver SecureString y Marshal.SecureStringToGlobalAllocUnicode.

La única manerapara obtener el valor de texto sin formato de un SecureString es utilizar uno de los métodos Marshal para copiarlo en la memoria no administrada.

Cuestiones relacionadas