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?
Antwort
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
)
Wichtiger Unterschied zwischen Zeigern und Referenzen: Letzteres unterstützt keine Zeigerarithmetik! –
@Joachim - lass uns alle beten, dass er normalerweise keine Zeigerarithmetik in seinen Baumstrukturen verwendet. –
danke für Ihre Hilfe. –
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.
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
@Christophe Danke, repariere die defekten Links. Außerdem wurde klargestellt, dass Boxing/Unexxing sichere Wege sind, die unsicheren Zeiger zu vermeiden. – kennytm
viel klarer! Danke – Christophe
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.
Sprechen Sie über selbst dokumentierenden Code! – LiraNuna
Ja, es ist ein Zeiger: 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/richtig inkrementieren-an-intptr.aspx –
Es gibt eine große Reihe von Datenstrukturen in .Net 2 auf MSDN implementiert.
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.
- 1. Gibt es C++ faulen Zeiger?
- 2. -Fomit-Frame-Zeiger, ist es sicher, es zu benutzen?
- 3. Gibt es Zeiger in Javascript?
- 4. Gibt es in C/C++ gezackte Arrays?
- 5. gibt es Funktionszeiger in C#?
- 6. Ist es sicher, Zeiger auf Elemente in Datenstrukturen zu haben? (C++ mit QT)
- 7. Ist es sicher anzunehmen, dass ein Zeiger die Größe eines int in C hat?
- 8. Gibt es "Entwurfsmuster" in C?
- 9. Gibt es eine Entsprechung in C für C++ - Vorlagen?
- 10. Meteor - Wie sicher ist es?
- 11. gibt es sowas wie C++ const in C#?
- 12. Gibt es eine C++ neue Deklaration wie in C#
- 13. C++ Ifstream-Objekt entspricht nullptr, aber es ist kein Zeiger?
- 14. Gibt es Guava für C#?
- 15. Gibt es einen C++ Almanach?
- 16. C++ Warum ist es nicht die gleiche Adresse (Zeiger)
- 17. Wann ist es legal, mit einem Zeiger auf einen Zeiger in C zu tippen?
- 18. Gibt es einen C++ - Decompiler?
- 19. Wie ist es möglich, ::: in C++ und ??? in C#?
- 20. Gibt es etwas wie GhostDoc für C++
- 21. Gibt es in C# einen Exponentenoperator?
- 22. Gibt es binäre Speicher Streams in C++
- 23. Gibt es einen Funktionstyp in C#?
- 24. Gibt es einen Interpreter für C?
- 25. Gibt es eine C++ 11 CSPRNG?
- 26. gibt es solche Listensteuerung in C++
- 27. Gibt es eine faule "String.Split" in C#
- 28. Gibt es virtuelle Klasse in C#?
- 29. Gibt es in objective-c oder c einen PDF-Parser?
- 30. Gibt es ein Standard-C++ -Äquivalent von C# 's Vector3?
Bitte, könnten Sie zuerst nach diesen Schlüsselwörtern auf SO suchen und nur die Sachen fragen, die noch nicht abgedeckt sind. –
Code mit Zeigern muss mit 'unsicher' getaggt werden. – nothrow
Die Verwendung von Zeigern ist NICHT sicher irgendwo;) –