Pregunta

En caso de utilizar punteros en su código C #? ¿Cuales son los beneficios? Se recomiende por el hombre (Microsoft)?

¿Fue útil?

Solución

A partir de "El hombre" a sí mismo:

El uso de punteros rara vez se requiere en C #, pero hay algunas situaciones que lo requieran. Como ejemplos, utilizando un contexto inseguro para permitir punteros está garantizado por los siguientes casos:

  • Tratar con las estructuras existentes en el disco
  • COM avanzada o invocación de plataforma escenarios que implican estructuras con punteros en ellos
  • Código de rendimiento crítico

El uso del contexto inseguro en otras situaciones no se recomienda.

En concreto, un contexto inseguro no debe utilizarse para tratar de escribir código C en C #.

Atención:

El código escrito usando un contexto inseguro no se puede verificar para estar seguro, por lo que sólo se ejecutará cuando el código es de plena confianza. En otras palabras, código no seguro no puede ser ejecutado en un entorno sin confianza. Por ejemplo, no se puede ejecutar código no seguro directamente desde Internet.

Referencia

Otros consejos

Si es necesario.

Digamos que es necesario falso color de una imagen en escala de grises grande, dicen 2000x2000 píxeles. Primero escriba la versión 'segura' usando GetPixel() y SetPixel(). Si eso funciona, grande, seguir adelante. si eso resulta ser demasiado lento, es posible que necesite para llegar a los bits reales que componen la imagen (olvidarse de las matrices de color por el bien del ejemplo). No hay nada 'malo' sobre el uso de código no seguro, pero añade complejidad al proyecto y por lo tanto se debe utilizar sólo cuando sea necesario.

No puedo recordar haber tenido para hacerlo - pero no he hecho mucho de interoperabilidad. Esa es la aplicación más común, creo: poner en código nativo. Hay muy pocos momentos en los que el uso de punteros le permite optimizar algo de código, pero es bastante raro en mi experiencia.

Si le sirve de guía, yo me considero bastante experiencia en C #, pero si tuviera que hacer ningún código no seguro que tendría que consultar las especificaciones / libros / MSDN que me guíe. Por supuesto que habrá un montón de personas que están contentos con código no seguro pero menos familiarizados con (por ejemplo) las expresiones de consulta ...

Yo diría que los principales problemas son: -

  • código no seguro no es verificable. Esto significa que el código puede solamente se corrió por un usuario de un contexto totalmente de confianza, por lo que si alguna vez necesita un usuario para ejecutar el código desde cualquier lugar menos en su totalidad de confianza (por ejemplo, un recurso compartido de red no está configurado para serlo), estás jodido.
  • La falta de verificabilidad (hm no está seguro de si eso es en realidad una palabra) también significa que podría potencialmente desordenar la memoria en su programa. Estás potencialmente trayendo clases enteras de insectos de nuevo en su aplicación - desbordamientos de búfer, referencia colgante, yada yada puaj puaj. no mencionar que es potencialmente capaz de estructuras de datos corruptas en la memoria sin darse cuenta cuando el puntero pasa raro.
  • Si desea que su código no seguro para acceder a los objetos gestionados que necesita para 'pin' ellos. Esto significa que el GC no se le permite mover el objeto en torno a la memoria y por lo tanto el montón administrado puede fragmentarse. Esto tiene implicaciones de rendimiento; Por lo tanto, siempre es importante para determinar si la ganancia potencial Potencia no se ve compensado por este problema.
  • Su código se vuelve más difícil de entender para los programadores que no se usan para el enfoque no administrado. A continuación, pueden ser más susceptibles a disparar su pie con un poco de la 'libertad' código no seguro les da.
  • Usted se convierte en capaz de escribir el código de seguridad de tipo no-; esto realmente bien elimina una gran cantidad de la ventaja de un buen lenguaje administrado borrosa caliente. Ahora se puede encontrar problemas de seguridad tipo horrible. ¿Por qué dar ese paso hacia atrás?
  • Esto hace que su código de más feo .

Estoy seguro de que hay más que podría añadirse a la lista; en general, como otros han dicho - evitar a menos que tenga to.e.g. llamar a un método no administrado a través de P / Invoke, que requiere un poco de Funking especial puntero. Incluso entonces el contador de referencias en su mayoría prevenir la necesidad de que, en su mayoría.

'El hombre también evitar decir menos que sea necesario, en el fondo.

Oh, buen artículo sobre cómo marcar aquí en MSDN por cierto .

código no seguro es un soporte total la función de CLR .NET. Los beneficios son el rendimiento y la compatibilidad con el código binario. El tiempo de ejecución es una caja de arena que le impide estrellarse y la quema, pero que viene con un costo. En situaciones en las que se realizan operaciones muy intensivos en contra de grandes manchas en la memoria, por ejemplo la manipulación de la imagen, es más rápido al paso fuera de la seguridad normal, el tiempo de ejecución proporciona.

Dicho esto, creo que más gente aquí podría decir "no lo hacen". La gran mayoría de los desarrolladores de .NET no se ejecutará en un caso en sus actividades normales que sólo puede resolverse mediante el uso de código no seguro.

He utilizado código no seguro utilizar suplantación para permitir el acceso a los servicios compartidos de red. No es un problema si usted sabe lo que está haciendo.

Usted debe usarlos si los necesita; Sobre todo esto será cuando se trata de algunos de los escenarios de interoperabilidad difíciles (por ejemplo, cuando escribí un contenedor administrado por DPAPI en .NET 1.0 que eran necesarios), pero muy de vez en cuando puede ser que sea para mejorar el rendimiento (después del perfilado!) mediante el uso de stackalloc o similar.

Se recomienda por Microsoft en todo lo que son los diseñadores de C #, y se tomó la decisión de añadir la capacidad de escribir código unsafe en ella. Se puede ver en la elección de palabras clave y el requisito para delinear los métodos / clases en las que se escriben usando la palabra clave, que no está diseñado para ser la elección de facto aplicación.

Al igual que Reinterpretive no escayolas suministrada por BitConverter.
Específicamente convertir un unint en un int para las funciones de hash donde lo único que importa es los bits.

El uso de algunos útiles, bien razonada sobre C o C ++ funciones idiomáticas en estructuras en las que necesita para tratarlos como un byte * de una longitud conocida, de nuevo más útil para hash.

extremadamente rápida serialización binaria de (muy específico) en estructuras de memoria (por hacerlo de una gran variedad de ellos), aunque para ser honesto, esto es mejor hacerlo con sólo dejar caer a C ++ / CLI.

Hay que decir que en muchos casos la tarea que requiere punteros a menudo se puede resolver mejor haciendo en C ++ / CLI y luego importar este en ti C # proyecto como un archivo DLL. No cambia si el código es 'seguro' o no, pero hace un montón de funciones útiles para el funcionamiento de las estructuras de base de puntero más accesibles. También le permite a enredar con los tipos genéricos o enumeraciones si realmente desea.

La probabilidad de que la mayoría de los desarrolladores que necesitan para hacer esto es de hecho remoto. Útil cuando lo necesite, aunque ...

Por supuesto que no se "recomienda", es por eso que está etiquetado como "no seguro". Pero no deje que eso te asuste. Aunque, hay que hacen ver dos veces en su código. Tal vez hay una manera conseguido hacerlo?

utilizando el código inseguro es como olvidar las benenfits del marco .NET, he usado una vez para viejas estructuras de moda creados como pilas y esas cosas, pero eso fue sólo para la escuela, hoy en día no he tenido la necesidad de usarlos.

Hágalo si se hace el código más corto y más claro.

"Siga sus inclinaciones teniendo debidamente en cuenta el policía de la esquina." WSM

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top