it-swarm.com.de

Gibt es Zeiger in C # wie C ++? Ist es sicher?

Ich schreibe eine Anwendung, die mit einer Baumdatenstruktur arbeitet. Ich habe es mit C++ geschrieben, jetzt möchte ich es mit C # schreiben. Ich verwende Zeiger zum Implementieren der Baumdatenstruktur. Gibt es auch einen Zeiger in C #? Ist es sicher, es zu benutzen?

44
masoud ramezani

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

Die Verwendung ist zum größten Teil ähnlich wie bei Zeigern, es gibt jedoch Vorteile wie die Speicherbereinigung.

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

Sehenswürdigkeiten:

  • Es ist nicht erforderlich, den Typ mit * Zu ändern, wenn die Mitglieder deklariert werden
  • Keine Notwendigkeit, sie in einem Konstruktor auf null zu setzen (sie sind bereits null)
  • Kein spezieller Operator -> Für den Mitgliederzugriff
  • Es muss kein Destruktor geschrieben werden (obwohl IDisposable nachgeschlagen wird)
41

[~ # ~] ja [~ # ~] . Es gibt Zeiger in C #.

[~ # ~] nein [~ # ~] . Sie sind [~ # ~] nicht [~ # ~] sicher.

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

Beispiele finden Sie unter hier und MSDN .

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

Increment(&count);

Verwenden Sie dies stattdessen und der Code ist SAFE und CLEAN.

static void Increment(ref int i)
{
    i++;
}

Increment(ref count);
32
Pratik Deoghare

Gibt es in C # auch einen Zeiger?

Ja , deklariert mit der Syntax int* varName;.

Ist die Verwendung des Safes sicher?

Keine Zeiger sind nicht sicher .

Es gibt sichere Möglichkeiten, eine Datenstruktur ohne Zeiger zu erstellen. Wenn die Knoten Klassen sind, sind sie automatisch Referenztypen , sodass Sie keine Zeiger benötigen. Andernfalls können Sie sie in eine Referenz einschließen .

19
kennytm
4
Tuomas Hietanen

In .Net 2 auf MSDN ist eine Reihe von Datenstrukturen implementiert.

Datenstrukturen Teil 1

Sie enthalten Beispielcode für Dinge wie Binary Search Tree, Graph, SkipList, NodeList usw. Der Code ist ziemlich vollständig und enthält eine Reihe von Seiten mit Dokumenten darüber, warum diese Strukturen funktionieren usw.

Keiner von Microsoft verwendet Zeiger. Im Allgemeinen MÜSSEN Sie sie nie in C # verwenden. Es gibt Zeiten, in denen es nett wäre, sie zu verwenden, oder sie sind genau so, wie Sie es von C++ halten. Sie können jedoch normalerweise einen Weg finden, sie nicht zu verwenden.

Der Hauptgrund, warum Sie keinen unsicheren Code für Zeiger verwenden sollten, besteht darin, dass Sie die Konformität mit Medium Trust verlieren. Sie können keine Mechanismen wie "Einmal klicken", asp.net-Websites durchlaufen und Silverlight lässt sie auch nicht zu. Halten Sie sich an refs und vollständig verwaltete Konzepte, um sicherzustellen, dass Ihr Code an mehreren Stellen ausgeführt werden kann.

2
Jason Short