C# Unsicherer Code

Wenn ein Codeblockunsafeverwendet. Wenn er mit dem Modifizierer markiert ist, erlaubt C# die Verwendung von Zeigervariablen in Funktionen.Unsicherer Codeoder nicht verwalteter Code bezieht sich auf die Verwendung vonZeigerVariablen-Codeblock.

Zeigervariablen

ZeigerEin Zeiger ist eine Variable, deren Wert die Adresse einer anderen Variablen ist, das heißt, die direkte Adresse eines Speicherorts. Wie bei anderen Variablen oder Konstanten müssen Sie einen Zeiger deklarieren, bevor Sie ihn verwenden können, um die Adresse einer anderen Variablen zu speichern.

Die allgemeine Form einer Zeigervariablendeklaration ist:

type* var-name;

Nachfolgend ist ein Beispiel für eine Zeigertypdeklaration:

Beispiel Beschreibung
int* p pist ein Zeiger auf eine Ganzzahl.
double* p pEs ist ein Zeiger auf eine Gleitkommazahl mit doppelter Genauigkeit.
float* p pist ein Zeiger auf eine Gleitkommazahl.
int** p pist ein Zeiger auf einen Zeiger auf eine Ganzzahl.
int*[] p pist ein eindimensionales Array von Zeigern auf Ganzzahlen.
char* p pist ein Zeiger auf ein Zeichen.
void* p pEs ist ein Zeiger auf einen unbekannten Typ.

Wenn mehrere Zeiger in derselben Deklaration deklariert werden, wird das Sternchen*nur beim Basistyp geschrieben; es wird nicht als Präfix für jeden Zeigernamen verwendet. Zum Beispiel:

int* p1, p2, p3;     // 正确  
int *p1, *p2, *p3;   // 错误 

Das folgende Beispiel veranschaulicht die Verwendung vonunsafeZeigern in C#, wenn der Modifizierer verwendet wird:

Beispiel

using System;
namespace UnsafeCodeApplication
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Daten sind: {0} ",  var);
            Console.WriteLine("Adresse ist: {0}",  (int)p);
            Console.ReadKey();
        }
    }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Data is: 20
Address is: 99215364

Sie können auch vermeiden, die gesamte Methode als unsicheren Code zu deklarieren, und müssen nur einen Teil der Methode als unsicheren Code deklarieren. Das folgende Beispiel veranschaulicht dies.

Verwenden von Zeigern zum Abrufen von Datenwerten

Sie können die MethodeToString()verwenden, um die an der vom Zeiger referenzierten Stelle gespeicherten Daten abzurufen. Das folgende Beispiel veranschaulicht dies:

Beispiel

using System;
namespace UnsafeCodeApplication
{
   class Program
   {
      public static void Main()
      {
         unsafe
         {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Daten sind: {0} " , var);
            Console.WriteLine("Daten sind: {0} " , p->ToString());
            Console.WriteLine("Adresse ist: {0} " , (int)p);
         }
         Console.ReadKey();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Data is: 20
Data is: 20
Address is: 77128984

Übergeben von Zeigern als Methodenparameter

Sie können Zeigervariablen als Parameter an eine Methode übergeben. Das folgende Beispiel veranschaulicht dies:

Beispiel

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe void swap(int* p, int *q)
      {
         int temp = *p;
         *p = *q;
         *q = temp;
      }

      public unsafe static void Main()
      {
         TestPointer p = new TestPointer();
         int var1 = 10;
         int var2 = 20;
         int* x = &var1;
         int* y = &var2;
         
         Console.WriteLine("Vor dem Tauschen: var1:{0}, var2: {1}", var1, var2);
         p.swap(x, y);

         Console.WriteLine("Nach dem Tauschen: var1:{0}, var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10

Verwenden von Zeigern für den Zugriff auf Array-Elemente

In C# sind ein Arrayname und ein Zeiger auf denselben Datentyp wie die Arraydaten unterschiedliche Variablentypen. Zum Beispiel sind int *p und int[] p unterschiedliche Typen. Sie können die Zeigervariable p inkrementieren, weil sie nicht fest im Speicher sitzt, aber die Arrayadresse ist fest im Speicher, deshalb können Sie das Array p nicht inkrementieren.

Wenn Sie daher eine Zeigervariable verwenden müssen, um auf Arraydaten zuzugreifen, können Sie, wie wir es normalerweise in C oder C++ tun, dasfixedSchlüsselwort verwenden, um den Zeiger zu fixieren.

Das folgende Beispiel demonstriert dies:

Beispiel

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)

         /* Array-Adresse im Zeiger anzeigen */
         for ( int i = 0; i < 3; i++)
         {
            Console.WriteLine("Adresse von list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Wert von list[{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

Kompilieren von unsicherem Code

Um unsicheren Code zu kompilieren, müssen Sie zum Befehlszeilencompiler wechseln und die Befehlszeile/unsafeangeben.

Um beispielsweise ein Programm namens prog1.cs zu kompilieren, das unsicheren Code enthält, müssen Sie den Befehl in der Befehlszeile eingeben:

csc /unsafe prog1.cs

Wenn Sie die Visual Studio IDE verwenden, müssen Sie unsicheren Code in den Projekteigenschaften aktivieren.

Schritte:

  • Öffnen Sie den Knoten Eigenschaften im Projektmappen-Explorer per Doppelklick.Projekteigenschaften (Projekteigenschaften)。
  • Klicken Sie auf die RegisterkarteBuild.
  • Option auswählen"Unsicheren Code zulassen"。
Weitere Erweiterungen