C# - Referenz-member-Variablen
In C# gibt es eine Möglichkeit, um eine Referenz als member-variable in ein Objekt (wie ein Zeiger auf ein Objekt in C++), nicht nur als parameter?
EDIT: Wie kann ich einen pointer oder eine Referenz auf ein Objekt als member-variable?
Sie haben zu erarbeiten, meinst du
Das, was Objekt als Mitglied der Objekt tatsächlich ist. Es ist bereits als Referenz. Sie brauchen nichts extra. Und wenn Sie denken, dass der life-cycle-Steuerung. Dann der garbage collector kümmert sich um die Zerstörung des Objekts, wenn der Letzte Verweis freigegeben wird.
ref
oder nur die umgangssprachliche "Referenz"?Das, was Objekt als Mitglied der Objekt tatsächlich ist. Es ist bereits als Referenz. Sie brauchen nichts extra. Und wenn Sie denken, dass der life-cycle-Steuerung. Dann der garbage collector kümmert sich um die Zerstörung des Objekts, wenn der Letzte Verweis freigegeben wird.
InformationsquelleAutor Andrew | 2011-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du meinst
ref
die argument-übergabe-Konvention, dann Nein, Sie können nicht speichern Sie diese. Von der ersten note auf der MSDN-Website:Bearbeiten: auf der Grundlage des aktualisierten Frage, hat C# eine unterschiedliche Nomenklatur über Zeiger und Referenzen. Ein Zeiger in C# das ist eine unsicher - Konstrukt verwendet, um etwas direkt auf den Speicherbereich eines Objekts. Ich sage etwas, weil der Speicher Ort ändern können, basierend auf die garbage collection (es sei denn, Sie lösen es in Erinnerung).
Referenzen in C# sind die Standard-Referenz-Typen übergeben werden und gespeichert werden. Sie sind verwandt mit Zeiger in anderen Sprachen, aber nicht ganz das gleiche. Jedoch, die by-reference argument übergeben Konvention ermöglicht es Ihnen, direkt zu ändern, was ein Objekt verweist.
Wenn Ihr Ziel ist, um einen veränderlich Referenz zu einem nicht-Referenz-Typ lokale variable, müssen Sie Kapseln die lokale variable in eine Referenz Art (wie eine Klasse). Wenn Sie könnten, geben Sie einige Beispiel-code, wir geben einige konkrete Beispiele.
InformationsquelleAutor user7116
Nicht. Vergessen Sie nicht, dass das argument könnte sich um eine lokale variable, die ist out of scope durch die Nutzung der Objekt später auf. Ein paar Optionen:
Es ist schwer zu wissen, welche am besten geeignet ist, ohne zu wissen, mehr über das, was Sie zu erreichen versuchen, aber
ref
ist eine Sackgasse.InformationsquelleAutor Jon Skeet
Ja, wenn es ein Referenz-Typ-Instanz. Und dann ist es der einzige Weg, um es zu speichern in einer anderen Klasse:
Nein, wenn es sich um eine Wert-Typ oder eine Referenz auf eine Referenz.Würden Sie sehen, eine einfache Objekt-Referenzen überall, dass C++ - Zeiger verwendet, wie in den Aufbau von Bäumen oder verketteten Listen.
InformationsquelleAutor Henk Holterman
Für das, was Ihren Wert, Sie könnte verwenden Sie ein array der Größe 1 als Referenz/Zeiger. Dies führt zu besser lesbaren code als eine neue Klasse zu erstellen, wickeln Sie einen einzigen Wert Typ member.
Ähnlicher trick kann verwendet werden, zu versuchen, die sehr entmutigt die Praxis der Verwendung von mutable structs.
Dann verwenden Sie die array-Schreibweise zu "dereferenzieren".
InformationsquelleAutor AdIch
Den Weg, um die Adresse einer Variablen ist der & - operator, ähnlich zu C++. Wieder ähnlich zu C++, können Sie die Adresse speichern, die als ein Zeiger:
Beachten Sie, dass code, der mit der Adresse-von-operator (&) oder Zeiger muss innerhalb einer Methode, die als nicht sicher gekennzeichnet oder in eine unsichere code-block.
Dies könnte nützlich sein, wenn Sie wollen, um die Leistung zu erhöhen, indem Sie nicht tun, array-bound-Prüfung zum Beispiel. Der Nachteil (neben Sicherheitsbedenken) ist, dass die Montage muss voll vertrauenswürdig ausgeführt werden.
Als wies darauf hin, in C#, die Sie nur sehr selten tatsächlich speichern Zeiger, stattdessen haben Sie die Verweise speichern, so dass der garbage collector ordnungsgemäß funktionieren kann. Sicherzustellen, dass Sie wirklich brauchen, Zeiger in Ihrem code, bevor Sie Sie verwenden!
Weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
Seine Frage ist eine Zeile ohne Rahmen - "Wie kann ich einen pointer?" Du hast Recht, es ist fast immer unnötig, aber vielleicht in dem Zusammenhang schaut er es angemessen ist.
"stattdessen haben Sie die Verweise speichern, so dass der garbage collector ordnungsgemäß funktionieren kann" <-- Klingt sicherer als die Verwendung von Zeigern. Wie kann ich es tun?
Ziemlich viel, was Henk schrieb oben. Sie stellen nur eine variable eines Referenz-Typ. Denke, dass jede variable in C# ist ein Zeiger, aber Sie nicht zu tun haben, jede Dereferenzierung (->). Wenn die Letzte Referenz (C# Zeiger) auf ein Objekt fällt aus dem Rahmen, der garbage collector markiert das Objekt für die garbage-collecting. Dies könnte hilfreich sein: albahari.com/valuevsreftypes.aspx
InformationsquelleAutor Greggo