English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Unsichere Code

Wenn ein Codeblock verwendet wird unsicher Modifikator markiert, dann erlaubt C# den Einsatz von Zeigervariablen in Funktionen.unsicherer Codeoder nicht verwaltetes Code ist, das die Verwendung vonZeigerCodeblock der Variable.

Zeiger-Variable

Zeiger ist eine Variable, deren Wert die Adresse einer anderen Variable ist, d.h. die direkte Adresse eines Speicherortes. Wie andere Variablen oder Konstanten müssen Sie den Zeiger zuvor deklarieren, bevor Sie die Adresse anderer Variablen im Zeiger speichern.

Die allgemeine Form der Zeiger-Variablen-Deklaration ist:

type* var-name;

Nachfolgend sind Beispiele für Zeiger-Typdeklarationen gezeigt:

BeispielBeschreibung
int* pp ist ein Zeiger auf Ganzzahlen.
double* pp ist ein Zeiger auf双精度数.
float* pp ist ein Zeiger auf Fließkommazahlen.
int** pp ist ein Zeiger auf Zeiger auf Ganzzahlen.
int*[] pp ist ein eindimensionales Array von Zeigern auf Ganzzahlen.
char* pp ist ein Zeiger auf ein Zeichen.
void* pp ist ein Zeiger auf einen unbekannten Typ.

Wenn mehrere Zeiger in derselben Deklaration deklariert werden, der Stern * Nur mit Basistypen geschrieben; nicht als Präfix für jeden Zeigername verwendet. Zum Beispiel:

int* p1, p2, p3;     // Richtig  
int *p1, *p2, *p3;   // Fehler

Ein Beispiel zeigt, wie in C# der Modifikator verwendet wird unsicher Verwendung von Pointern als Modifikator:

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, erzeugt er die folgenden Ergebnisse:

Daten sind: 20
Adresse ist: 99215364

Sie können auch nicht die gesamte Methode als unsicheres Code deklarieren, sondern nur einen Teil der Methode als unsicheren Code. Ein Beispiel zeigt dies:

Datenwerte mit Zeigern abrufen

Sie können verwenden ToString() Eine Methode检索指针变量所引用位置的数据。以下示例说明了这一点:

using System;
namespace UnsafeCodeApplication
{
   class Program
   {
      public static void Main()
      {
         unsicher
         {
            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, erzeugt er die folgenden Ergebnisse:

Daten sind: 20
Daten sind: 20
Adresse ist: 77128984

Zeiger als Parameter übergeben

Sie können einen Zeiger als Parameter an die Methode übergeben. Ein Beispiel zeigt dies:

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 Tausch: var1:{0}, var2: {1}1, var2);
         p.swap(x, y);
         Console.WriteLine("Nach dem Tausch: var1:{0}, var2: {1}1, var2);
         Console.ReadKey();
      }
   }
}

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

Vor dem Tausch: var1: 10, var2: 20
Nach dem Tausch: var1: 20, var2: 10

Array-Elemente mit Zeiger ansprechen

In C# ist der Array-Name und ein Zeiger auf Daten des gleichen Datentyps wie der Array ein anderer Variablen-Typ. Zum Beispiel int *p und int[] p sind verschiedene Typen. Sie können den Zeiger-Variable p erhöhen, da er im Speicher nicht fix ist, aber die Array-Adresse im Speicher ist fix, daher können Sie den Array p nicht erhöhen.

Daher können Sie, um auf Array-Daten mit Zeiger-Variable zuzugreifen, wie wir normalerweise in C oder C++ Wie in der obigen Beispiel gezeigt, verwenden fixed Schlüsselwörter, um Zeiger zu fixieren.

Der folgende Beispiel zeigt dies:

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)
         /* Anzeige der Array-Adresse im Zeiger */
         for ( int i = 0; i < 3; i++)
         {
            Console.WriteLine("Adresse von list[{0}]=")1} + i));
            Console.WriteLine("Wert von list[{0}]=")1} *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

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

Adresse von list[0] = 31627168
Wert von list[0] = 10
Adresse von list[1] = 31627172
Wert von list[1] = 100
Adresse von list[2] = 31627176
Wert von list[2] = 200

Kompilierung unsicherer Code

Um unsicheres Code zu kompilieren, müssen Sie auf den Kommandozeilen-Kompilierer wechseln. /unsicher Kommandozeile.

Zum Beispiel, um ein Programm namens prog mit unsicherem Code zu kompilieren1Geben Sie den Befehl ein, um das Programm .cs mit unsicherem Code zu kompilieren:

csc /unsafe prog1.cs

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

Die Schritte sind wie folgt:

  • Wenn Sie Visual Studio IDE verwenden, müssen Sie unsicheren Code in den Projektattributen aktivieren.Projektattribute (Projekt Eigenschaften)

  • Klicken Bauen Registerkarte.

  • Wählen Sie die Option "Erlaube unsicheren Code"。