Estoy escribiendo una aplicación que funciona con una estructura de datos de árbol. Lo escribí con C++, ahora quiero escribirlo con C#. Uso punteros para implementar la estructura de datos de árbol. ¿Hay un puntero en C# también? ¿Es seguro usarlo?¿Hay puntero en C# como C++? ¿Es seguro?
Respuesta
Si va a implementar una estructura de árbol en C# (o Java, o muchos otros idiomas) que tendría que utilizar referencias en lugar de punteros. NÓTESE BIEN. las referencias en C++ no son las mismas que estas referencias.
El uso es similar a los punteros en su mayor parte, pero hay ventajas como la recolección de basura.
class TreeNode
{
private TreeNode parent, firstChild, nextSibling;
public InsertChild(TreeNode newChild)
{
newChild.parent = this;
newChild.nextSibling = firstChild;
firstChild = newChild;
}
}
var root = new TreeNode();
var child1 = new TreeNode();
root.InsertChild(child1);
Puntos de interés:
- No hay necesidad de modificar el tipo con
*
cuando se declaran los miembros - No hay necesidad de ponerlos en null en un constructor (que ya están nulo)
- Sin operador especial
->
para acceso de miembro - No es necesario escribir un destructor (aunque consulte
IDisposable
)
Importante diferencia entre punteros y referencias: ¡este último no es compatible con la aritmética del puntero! –
@Joachim - Oremos todos por que normalmente no utiliza la aritmética del puntero en las estructuras de sus árboles. –
gracias por su ayuda. –
¿Hay puntero en C# también?
Yes, declarado mediante la sintaxis int* varName;
.
¿Está utilizando esa caja fuerte?
No hay punteros son no es seguro.
Existen formas seguras de construir una estructura de datos sin punteros. Si los nodos son clases, entonces serán automáticamente reference types, por lo que no necesita punteros. De lo contrario, puede box them into a reference.
Interesante respuesta. Lamentablemente, el enlace a la parte sí parece estar roto (es decir, la descarga del documento completo frente a 2005 en lugar de la función de idioma específico). El boxeo/unboxing da la impresión de que es seguro; ¿por qué no? – Christophe
@Christophe Gracias, corrigió los enlaces rotos. También se aclaró la redacción, que el boxeo/inobservancia son formas seguras de evitar los indicadores inseguros. – kennytm
mucho más claro! Gracias – Christophe
SÍ. Hay punteros en C#.
NO. Son NOT seguros.
Realmente tiene que utilizar la palabra clave unsafe
cuando utiliza punteros en C#.
Para ejemplos vistazo here y MSDN.
static unsafe void Increment(int* i)
{
*i++;
}
Increment(&count);
El uso de este lugar y el código será seguro y limpio.
static void Increment(ref int i)
{
i++;
}
Increment(ref count);
¡Hable sobre el código de auto documentación! – LiraNuna
sí, hay un puntero: IntPtr
Wikipedia: "which is a safe managed equivalent to int*, and does not require unsafe code"
http: //blogs.msdn.com/jaredpar/archive/2008/11/11/properly-incrementing-an-intptr.aspx –
hay una gran serie de estructuras de datos implementadas en .Net 2 en MSDN.
Ellos incluyen código de ejemplo para cosas como el árbol de búsqueda binaria, Gráfico, SkipList, NodeList, etc. El código es bastante completo e incluye una serie de páginas de documentos acerca de por qué estas estructuras funcionan, etc.
Ninguna de las de Microsoft usa punteros. En general, NUNCA NECESITAS usarlos en C#. Hay momentos en que usarlos sería bueno, o simplemente son la forma en que piensas desde C++. Pero generalmente puede encontrar una manera de no usarlos.
La razón principal por la que no se utiliza un código inseguro para los punteros es que se pierde el cumplimiento de Medium Trust. No puede ejecutar mecanismos como hacer clic una vez, sitios web de asp.net, y Silverlight tampoco los permite. Quédese con los refs y los conceptos completamente administrados para garantizar que su código se pueda ejecutar en más lugares.
- 1. ¿Es seguro mantener los punteros de C++ en C#?
- 2. C/C++ Puntero Pregunta
- 3. ¿Hay un puntero perezoso en C++?
- 4. C++: ¿es seguro usar longjmp y setjmp?
- 5. (nil) puntero en C/C++
- 6. ¿Es seguro asumir que un puntero es del tamaño de un int en C?
- 7. ¿Es seguro volver a va_list en C?
- 8. "este" puntero en C (no en C++)
- 9. Puntero de función C++ como parámetro
- 10. Puntero de función C++ como miembro estático
- 11. ¿Qué es un puntero Singleton en C?
- 12. puntero en C
- 13. ¿Es seguro el siguiente código C?
- 14. C++: Puntero como clave en una tabla hash
- 15. En C, ¿es seguro lanzar un puntero de función variable a un puntero de función con argumentos finitos?
- 16. Puntero a un puntero en objetivo-c?
- 17. C socket API es seguro para subprocesos?
- 18. Convertir del puntero C++/CLI al puntero nativo de C++
- 19. Paso C++ puntero como argumento en la función Cython
- 20. Objective-C ¿Es seguro sobreescribir [NSObject initialize]?
- 21. Código no seguro en C#
- 22. ¿Qué es ** en C++?
- 23. ¿Hay algo así como var_dump de PHP en c/C++?
- 24. puntero char gratuito en c
- 25. puntero inteligente Implementación en C
- 26. ¿Hay un compilador como servicio para C++?
- 27. ¿Es una buena práctica liberar un puntero NULL en C?
- 28. C Dereference void * puntero
- 29. C++ borrar un puntero a un puntero
- 30. ¿Cuál es la mejor forma portátil de representar puntero como cadena en C++?
Por favor, ¿podría buscar primero estas palabras clave en SO y preguntar solo las cosas que aún no están cubiertas. El código –
con punteros debe etiquetarse como "inseguro", adivina por qué. – nothrow
En realidad el uso de punteros NO es seguro en ningún lado;) –