2010-02-25 20 views
41

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?

+3

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 –

+2

con punteros debe etiquetarse como "inseguro", adivina por qué. – nothrow

+1

En realidad el uso de punteros NO es seguro en ningún lado;) –

Respuesta

36

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)
+0

Importante diferencia entre punteros y referencias: ¡este último no es compatible con la aritmética del puntero! –

+17

@Joachim - Oremos todos por que normalmente no utiliza la aritmética del puntero en las estructuras de sus árboles. –

+0

gracias por su ayuda. –

17

¿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.

+0

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

+0

@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

+0

mucho más claro! Gracias – Christophe

28

. 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); 
+12

¡Hable sobre el código de auto documentación! – LiraNuna

2

hay una gran serie de estructuras de datos implementadas en .Net 2 en MSDN.

Data Structures Part 1

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.