2010-02-25 17 views
41

Ich schreibe eine Anwendung, die mit einer Baumstruktur arbeiten. Ich habe es mit C++ geschrieben, jetzt möchte ich es mit C# schreiben. Ich benutze Zeiger für die Implementierung der Baumdatenstruktur. Gibt es auch einen Zeiger in C#? Ist es sicher, es zu benutzen?Gibt es Zeiger in C# wie C++? Ist es sicher?

+3

Bitte, könnten Sie zuerst nach diesen Schlüsselwörtern auf SO suchen und nur die Sachen fragen, die noch nicht abgedeckt sind. –

+2

Code mit Zeigern muss mit 'unsicher' getaggt werden. – nothrow

+1

Die Verwendung von Zeigern ist NICHT sicher irgendwo;) –

Antwort

36

Wenn Sie eine Baumstruktur in C# (oder Java oder vielen anderen Sprachen) implementieren, verwenden Sie Referenzen anstelle von Zeigern. NB. Referenzen in C++ sind nicht mit diesen Referenzen identisch.

Die Verwendung ist in den meisten Fällen vergleichbar mit Zeigern, aber es gibt Vorteile wie 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); 

Points of Interest:

  • Keine Notwendigkeit, die Art mit * zu ändern, wenn die Mitglieder
  • Keine Notwendigkeit zu erklären, sie setzen einen Konstruktor (sie sind bereits null) auf null in
  • Keine spezielle -> Operator für Mitglied Zugriff
  • Keine Notwendigkeit, einen Destruktor schreiben (obwohl nachschlagen IDisposable)
+0

Wichtiger Unterschied zwischen Zeigern und Referenzen: Letzteres unterstützt keine Zeigerarithmetik! –

+17

@Joachim - lass uns alle beten, dass er normalerweise keine Zeigerarithmetik in seinen Baumstrukturen verwendet. –

+0

danke für Ihre Hilfe. –

17

Gibt es Zeiger in C# auch?

Yes, mit der Syntax int* varName; deklariert.

Wird der Safe verwendet?

Keine Zeiger sind nicht sicher.

Es gibt sichere Möglichkeiten, eine Datenstruktur ohne Zeiger zu konstruieren. Wenn die Knoten Klassen sind, werden sie automatisch reference types, so dass Sie keine Zeiger benötigen. Andernfalls können Sie box them into a reference.

+0

Interessante Antwort. Leider scheint die Verknüpfung mit dem Ja-Teil gebrochen zu sein (d. H. Download von Full vs 2005 doc anstelle der spezifischen Sprachfunktion). Das Boxen/Unboxing vermittelt den Eindruck, dass es sicher ist; Warum nicht? – Christophe

+0

@Christophe Danke, repariere die defekten Links. Außerdem wurde klargestellt, dass Boxing/Unexxing sichere Wege sind, die unsicheren Zeiger zu vermeiden. – kennytm

+0

viel klarer! Danke – Christophe

28

JA. Es gibt Zeiger in C#.

NO. Sie sind NICHT sicher.

Sie müssen das Schlüsselwort unsafe verwenden, wenn Sie Zeiger in C# verwenden.

Beispiele sehen here und MSDN.

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

Increment(&count); 

verwenden statt und Code sicher und sauber sein.

+12

Sprechen Sie über selbst dokumentierenden Code! – LiraNuna

2

Es gibt eine große Reihe von Datenstrukturen in .Net 2 auf MSDN implementiert.

Data Structures Part 1

Sie enthalten Beispielcode für Dinge wie binärer Suchbaum, Grafik, skiplist, NodeList usw. Der Code ist recht vollständig und enthält eine Reihe von Seiten der Dokumente darüber, warum diese Strukturen funktionieren, usw.

Keine von Microsoft verwendet Zeiger. Im Allgemeinen brauchen Sie sie nie in C# zu verwenden. Es gibt Zeiten, in denen es nützlich wäre, sie zu verwenden, oder sie sind einfach so, wie Sie es von C++ denken. Aber Sie können normalerweise einen Weg finden, sie nicht zu benutzen.

Die Hauptgründe, warum Sie keinen unsicheren Code für Zeiger verwenden sollten, ist, dass Sie die Compliance von Medium Trust verlieren. Sie können nicht durch Mechanismen wie klicken Sie einmal, asp.net Websites laufen und Silverlight erlaubt sie auch nicht. Bleiben Sie bei Referenzen und vollständig verwalteten Konzepten, um sicherzustellen, dass Ihr Code an mehreren Orten ausgeführt werden kann.