2010-02-25 3 views
41

Sto scrivendo un'applicazione che funziona con una struttura dati ad albero. L'ho scritto con C++, ora voglio scriverlo con C#. Io uso i puntatori per implementare la struttura dei dati dell'albero. C'è un puntatore anche in C#? È sicuro usarlo?C'è un puntatore in C# come C++? È sicuro?

+3

Per favore, potreste prima cercare queste parole chiave su SO e chiedere solo le cose che non sono ancora coperte. Il codice –

+2

con i puntatori deve essere contrassegnato come "non sicuro", indovinate perché. – nothrow

+1

In realtà l'uso di puntatori NON è sicuro da nessuna parte;) –

risposta

36

Se si sta implementando una struttura ad albero in C# (o Java o in molte altre lingue) si utilizzano riferimenti anziché puntatori. NB. i riferimenti in C++ non sono gli stessi di questi riferimenti.

L'utilizzo è simile ai puntatori per la maggior parte, ma ci sono vantaggi come la garbage collection.

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); 

Punti di interesse:

  • Non c'è bisogno di modificare il tipo con * quando si dichiara i membri
  • Non c'è bisogno di impostare su null in un costruttore (sono già null)
  • Nessun operatore speciale -> per l'accesso membro
  • Non è necessario scrivere un distruttore (sebbene cercare IDisposable)
+0

Differenza importante tra puntatori e riferimenti: Quest'ultimo non supporta l'aritmetica del puntatore! –

+17

@Joachim - Preghiamo tutti che normalmente non usi l'aritmetica del puntatore nelle sue strutture ad albero. –

+0

grazie per il vostro aiuto. –

17

C'è un puntatore anche in C#?

Yes, dichiarato utilizzando la sintassi int* varName;.

L'utilizzo di tale cassaforte?

Nessun indicatore è non sicuro.

Esistono modi sicuri per costruire una struttura dati senza puntatori. Se i nodi sono classi, saranno automaticamente reference types in modo da non aver bisogno di alcun puntatore. Altrimenti, è possibile box them into a reference.

+0

Risposta interessante. Sfortunatamente, il collegamento alla parte si sembra rotto (ad esempio il download di un documento completo vs 2005 anziché di una lingua specifica). Il pugilato/unboxing dà l'impressione che sia sicuro; perché non è vero? – Christophe

+0

@Christophe Grazie, risolto i collegamenti interrotti. Ha anche chiarito le diciture, che il pugilato/l'annullamento dell'obbligo sono modi sicuri per evitare i puntatori non sicuri. – kennytm

+0

molto più chiaro! Grazie – Christophe

28

SI. Ci sono dei puntatori in C#.

NO. Sono NON sicuro.

In realtà è necessario utilizzare la parola chiave unsafe quando si utilizzano i puntatori in C#.

Per esempi un'occhiata here e MSDN.

static unsafe void Increment(int* i) 
{ 
    *i++; 
} 

Increment(&count); 

Usa questo invece e codice sarà sicuro e pulito.

+12

Parla del codice di auto-documentazione! – LiraNuna

2

C'è una grande serie di strutture dati implementate in Net 2 su MSDN.

Data Structures Part 1

Essi includono il codice di esempio per le cose come Binary Search Albero, Grafico, SkipList, NodeList, ecc Il codice è abbastanza completo e comprende una serie di pagine di documenti sul perché queste strutture funzionano, ecc

Nessuno di quelli di Microsoft usa i puntatori. In generale non hai mai BISOGNO di usarli in C#. Ci sono momenti in cui utilizzarli sarebbe bello, o sono solo il modo in cui si pensa dal C++. Ma di solito puoi trovare un modo per non usarli.

I motivi principali per cui non utilizzare un codice non sicuro per i puntatori è che si perde la conformità di Medium Trust. Non è possibile eseguire meccanismi come clic una volta, siti Web asp.net e Silverlight non consente nemmeno loro. Attenersi a ref e concetti completamente gestiti per garantire che il codice possa essere eseguito in più punti.