Verwendung verwalteter Zeiger in C #

Ein Zeiger ist eine Variable, die auf die Adresse einer anderen Variablen zeigt. Mit anderen Worten, ein Zeiger enthält die Speicheradresse einer anderen Variablen oder eines Speicherorts. Bis vor kurzem war die einzige Möglichkeit, mit Zeigern in C # zu arbeiten, die Verwendung von unsicherem Code. Sie können das unsafe Schlüsselwort verwenden, um einen unsicheren Kontext zu definieren und dann nicht verwaltete Zeiger zu erstellen oder native Funktionen mit nicht verwalteten Zeigern aufzurufen.

Hierbei ist zu beachten, dass unsicherer Code Code impliziert, der außerhalb des Kontexts der CLR ausgeführt wird. Es ist nicht verwalteter Code. Da Sie jedoch die von der CLR bereitgestellte Sicherheit standardmäßig deaktivieren, ist es ratsam, unsicheren Code nur zu verwenden, wenn Sie wissen, wie die Speicherverwaltung in .Net funktioniert.

Eine Objektreferenz in C # ist ein typsicherer Zeiger, der auf den Anfang eines Objekts zeigt. Es gibt einen anderen Zeigertyp in der CLR, der als verwalteter Zeiger bezeichnet wird. In diesem Artikel wird untersucht, was verwaltete Zeiger sind, warum sie nützlich sind und wie wir mit ihnen in C # arbeiten können.

Verwaltete Zeiger in C # erklärt

Ein verwalteter Zeiger unterscheidet sich von einem typsicheren Zeiger dadurch, dass er auf andere Positionen eines Objekts zeigen kann, dh nicht nur auf den Anfang des Objekts. Wie eine Objektreferenz kann ein verwalteter Zeiger auf Objekte verweisen, die im verwalteten Heap gespeichert sind. Der Unterschied besteht darin, dass ein verwalteter Zeiger auf Methodenparameter, Felder, Array-Elemente oder einen anderen Teil des Objekts verweisen kann, während eine Objektreferenz auf den Anfang des Objekts zeigt.

Im Wesentlichen kann ein verwalteter Zeiger auf Folgendes verweisen:

  • eine lokale Variable
  • ein Element eines Arrays
  • ein Methodenparameter
  • ein Feld eines zusammengesetzten Typs

Verwaltete Zeiger unterstützen die Zeigerarithmetik nicht direkt. Sie können die Werte der Adressen, auf die sie zeigen, nicht „addieren“ oder „subtrahieren“. Sie können keinen Wert eines verwalteten Zeigers eingeben. Anscheinend werden verwaltete Zeiger aufgrund dieser Einschränkungen in der C # -Sprache nicht explizit verfügbar gemacht. Verwaltete Zeiger sind jedoch seit langem als Referenzparameter in C # enthalten. Wenn Sie einen Parameter als Referenz an eine Methode übergeben, verwenden Sie einen verwalteten Zeiger hinter den Kulissen.

10 Regeln für die Verwendung verwalteter Zeiger in C #

Beachten Sie die folgenden Punkte bei verwalteten Zeigern.

  1. Verwaltete Zeiger dürfen nicht null sein.
  2. Es ist nicht möglich, dass ein verwalteter Zeiger auf einen anderen verwalteten Zeiger zeigt.
  3. Verwaltete Zeiger können sich nicht auf dem Heap befinden.
  4. Sie können einen verwalteten Zeiger nicht gegen eine Objektreferenz austauschen.
  5. Sie können verwaltete Zeiger nicht in statischen Variablen oder als Elemente eines Arrays oder Felds speichern.
  6. Sie können verwaltete Zeiger nicht als Elementtyp eines Arrays verwenden.
  7. Ein verwalteter Zeiger kann auf eine Objektreferenz oder einen Werttyp verweisen.
  8. Wenn Sie einen Methodenparameter als Referenz übergeben, ist das Argument tatsächlich ein verwalteter Zeiger.
  9. Verwaltete Zeiger werden auch als Byref-Typen bezeichnet.
  10. Ein verwalteter Zeiger kann auf eine lokale Variable einer Methode oder einen Parameter einer Methode verweisen.

Übergeben Sie ein Argument als Referenz in C #

Okay, wir haben genug von den Konzepten. Schreiben wir nun Code, um verwaltete Zeiger zu verstehen. Sie können ref-Parameter, ref-Locals oder ref-Rückgaben verwenden, um einen verwalteten Zeiger darzustellen. Lassen Sie uns diese einzeln untersuchen.

Betrachten Sie die folgende Struktur, die nur ein Element enthält, eine Ganzzahlvariable.

öffentliche Struktur MyStruct

{

   public int MyField;

}}

Die folgende Methode aktualisiert den Wert des MyField-Datenelements einer Instanz von MyStruct.

private static void Update (siehe MyStruct-Daten)

{

   data.MyField = 5;

}}

Das folgende Codeausschnitt zeigt, wie Sie ein Argument als Referenz anstelle eines Werts übergeben können.

public int Main ()

{

  MyStruct obj = new MyStruct ();

  obj.MyField = 1;

  Update (ref obj);

  Console.WriteLine (obj.MyField);

  Console.Read ();

}}

Sie können Strukturen anstelle von Klassen nutzen, um die Heap-Zuordnung und den Aufwand für das Kopieren von Daten zu vermeiden. Dies ist ein guter Optimierungstrick, der für Strukturen mit wenigen Datenelementen verwendet werden kann.

Wenn Sie das obige Programm ausführen, wird im Konsolenfenster „5“ angezeigt.

Verwenden Sie eine lokale Referenz, um einen verwalteten Zeiger in C # zu speichern

Sie können auch einen ref local verwenden, um einen verwalteten Zeiger zu speichern. Das folgende Codefragment zeigt, wie dies erreicht werden kann. Beachten Sie die Verwendung des Schlüsselworts ref auf beiden Seiten der Zuweisung.

public static void UpdateDataUsingRefLocal (MyStruct-Daten)

  {

     ref int refLocal = ref data.MyField;

     refLocal = 10;

  }}

Sie können ref-Rückgaben nutzen, um eine Variable von einer Methode zurückzugeben, die einen verwalteten Zeiger darstellt. Beachten Sie, dass dies keine lokale Variable sein kann, dh Sie können keine lokale Variable zurückgeben, die einen verwalteten Zeiger darstellt. Der Versuch, eine lokale Variable zurückzugeben, führt zu einem Kompilierungsfehler.

Das folgende Codefragment zeigt, wie Ref-Rückgaben verwendet werden können.

public static ref int GetMarksByRef (int [] Markierungen, int subjectIndex)

{

  Rückgabewerte [subjectIndex];

}}

Während eine Objektreferenz auf den Anfang eines Objekts zeigt, kann ein verwalteter Zeiger innerhalb eines Objekts, auf ein Feld eines Typs oder auf ein Element eines Arrays zeigen. Es ist interessant zu wissen, wie verwaltete Zeiger hinter den Kulissen funktionieren. Ich werde in einem zukünftigen Beitrag hier ausführlicher darauf eingehen, wie verwaltete Zeiger funktionieren.