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?
risposta
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
)
Differenza importante tra puntatori e riferimenti: Quest'ultimo non supporta l'aritmetica del puntatore! –
@Joachim - Preghiamo tutti che normalmente non usi l'aritmetica del puntatore nelle sue strutture ad albero. –
grazie per il vostro aiuto. –
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.
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
@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
molto più chiaro! Grazie – Christophe
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.
Parla del codice di auto-documentazione! – LiraNuna
sì, c'è un puntatore: 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/correttamente-incrementando-an-intptr.aspx –
C'è una grande serie di strutture dati implementate in Net 2 su MSDN.
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.
Per favore, potreste prima cercare queste parole chiave su SO e chiedere solo le cose che non sono ancora coperte. Il codice –
con i puntatori deve essere contrassegnato come "non sicuro", indovinate perché. – nothrow
In realtà l'uso di puntatori NON è sicuro da nessuna parte;) –