C# Unsicherer Code

Bei Verwendung eines Codeblocks unsafe Modifikator-Tag,C# Ermöglichen die Verwendung von Zeigervariablen in Funktionen。Unsicherer CodeOder nicht verwalteter Code bedeutet Verwendung vonZeigerVariabler Codeblock。

Zeigervariable

Zeiger Ist eine Variable, die die Adresse einer anderen Variablen ist,Das ist,Direkte Adresse des Speicherorts。Genau wie andere Variablen oder Konstanten,Sie müssen den Zeiger deklarieren, bevor Sie ihn zum Speichern anderer Variablenadressen verwenden。

Die allgemeine Form der Zeigervariablendeklaration lautet:

type* var-name;

Das Folgende ist ein Beispiel für eine Zeigertypdeklaration:

Instanz Beschreibung
int* p p Ist ein Zeiger auf eine Ganzzahl。
double* p p Ist ein Zeiger auf eine Zahl mit doppelter Genauigkeit。
float* p p Ist ein Zeiger auf eine Gleitkommazahl。
int** p p Ist ein Zeiger auf einen Zeiger auf eine Ganzzahl。
int*[] p p Ist ein eindimensionales Array von Zeigern auf ganze Zahlen。
char* p p Ist ein Zeiger auf ein Zeichen。
void* p p Ist ein Zeiger auf einen unbekannten Typ。

Wenn Sie mehrere Zeiger in derselben Deklaration deklarieren,Sternchen * Schreiben Sie nur mit dem zugrunde liegenden Typ;Anstatt als Präfix für jeden Zeigernamen verwendet zu werden。 Zum Beispiel:

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

Das folgende Beispiel zeigt C# Verwendet in unsafe Verwendung von Zeigern bei Modifikatoren:

Instanz

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

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

Data is: 20
Address is: 99215364

Sie müssen auch nicht die gesamte Methode als unsicheren Code deklarieren.,Sie müssen nur einen Teil der Methode als unsicheren Code deklarieren。Das folgende Beispiel veranschaulicht dies。

Datenwerte mit Zeigern abrufen

Sie können verwenden ToString() Die Methode ruft Daten ab, die an dem Ort gespeichert sind, auf den die Zeigervariable verweist。Das folgende Beispiel zeigt dies:

Instanz

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

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

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

Übergeben Sie den Zeiger als Parameter an die Methode

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

Instanz

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("Before Swap: var1:{0}, var2: {1}", var1, var2);
         p.swap(x, y);

         Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

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

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

Verwenden Sie Zeiger, um auf Array-Elemente zuzugreifen

In C# Medium,Der Arrayname und ein Zeiger auf denselben Datentyp wie die Arraydaten sind unterschiedliche Variablentypen。Zum Beispiel,int *p Und int[] p Ist ein anderer Typ。Sie können die Zeigervariable erhöhen p,Weil es nicht im Speicher fixiert ist,Die Array-Adresse ist jedoch im Speicher festgelegt,Sie können das Array also nicht vergrößern p。

Deshalb,Wenn Sie Zeigervariablen verwenden müssen, um auf Array-Daten zuzugreifen,Kann so sein wie wir normalerweise C Oder C++ Wie in gemacht,Verwenden Sie fixed Schlüsselwort zum Fixieren des Zeigers。

Das folgende Beispiel zeigt dies:

Instanz

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

         /* Zeigen Sie die Array-Adresse im Zeiger an */
         for ( int i = 0; i < 3; i++)
         {
            Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

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

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 Sie unsicheren Code

Um unsicheren Code zu kompilieren,Sie müssen zum angegebenen Befehlszeilen-Compiler wechseln /unsafe Befehlszeile。

Zum Beispiel,Um einen Namen zu kompilieren, der unsicheren Code enthält prog1.cs Programm,Müssen Sie den Befehl in der Befehlszeile eingeben:

csc /unsafe prog1.cs

如果您使用的是 Visual Studio IDE,那么您需要在项目属性中启用不安全代码。

步骤如下:

Tutorial für fliegende Fische@2001-2030