Heim  >  Artikel  >  Backend-Entwicklung  >  [C#-Tutorial] Unsicherer C#-Code

[C#-Tutorial] Unsicherer C#-Code

黄舟
黄舟Original
2016-12-24 13:10:111363Durchsuche

Unsicherer C#-Code

C# ermöglicht die Verwendung von Zeigervariablen in Funktionen, wenn ein Codeblock mit dem unsicheren Modifikator markiert ist. Unsicherer Code oder nicht verwalteter Code ist ein Codeblock, der Zeigervariablen verwendet.

Zeigervariablen

Ein Zeiger ist eine Variable, deren Wert die Adresse einer anderen Variablen ist, also die direkte Adresse eines Speicherorts. Genau wie andere Variablen oder Konstanten müssen Sie einen Zeiger deklarieren, bevor Sie ihn zum Speichern der Adresse einer anderen Variablen verwenden.

Die allgemeine Form der Zeigervariablendeklaration ist:

type *var-name;

Das Folgende sind gültige Zeigerdeklarationen:

int    *ip;    /* 指向一个整数 */
double *dp;    /* 指向一个双精度数 */
float  *fp;    /* 指向一个浮点数 */
char   *ch     /* 指向一个字符 */

Das folgende Beispiel veranschaulicht die Verwendung unsicherer Änderungen in C#-Verwendung von Laufzeitzeigern:

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

Data is: 20
Address is: 99215364

Sie können auch vermeiden, die gesamte Methode als unsicher zu deklarieren Code muss nur ein Teil der Methode als unsicherer Code deklariert werden. Das folgende Beispiel verdeutlicht diesen Punkt.

Datenwerte mithilfe von Zeigern abrufen

Sie können die ToString()-Methode verwenden, um Daten abzurufen, die an der Stelle gespeichert sind, auf die eine Zeigervariable verweist. Das folgende Beispiel zeigt dies:

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

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

Übergabe eines Zeigers als Methodenargument

Sie können Zeigervariablen als Parameter der Methode an Methoden übergeben. Das folgende Beispiel veranschaulicht 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("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, erzeugt er die folgenden Ergebnisse:

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

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

In C# sind ein Array-Name und ein Zeiger auf denselben Datentyp wie die Array-Daten unterschiedliche Variablentypen. Beispielsweise sind int *p und int[] p unterschiedliche Typen. Sie können die Zeigervariable p erhöhen, da sie nicht im Speicher festgelegt ist. Die Array-Adresse ist jedoch im Speicher festgelegt, sodass Sie das Array p nicht erhöhen können.

Wenn Sie also mithilfe von Zeigervariablen auf Array-Daten zugreifen müssen, können Sie das Schlüsselwort „fixed“ verwenden, um den Zeiger zu fixieren, wie wir es normalerweise in C oder C++ tun.

Das folgende Beispiel zeigt dies:

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

         /* 显示指针中数组地址 */
         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, erzeugt 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

Bei der Kompilierung wird kein sicherer Code erstellt

Um unsicheren Code zu kompilieren, müssen Sie zum Befehlszeilen-Compiler wechseln und die Befehlszeile /unsafe angeben.

Um beispielsweise ein Programm namens prog1.cs zu kompilieren, das unsicheren Code enthält, geben Sie den Befehl in die Befehlszeile ein:

csc /unsafe prog1.cs

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

Die Schritte sind wie folgt:

Öffnen Sie die Projekteigenschaften, indem Sie im Projektmappen-Explorer auf den Eigenschaftenknoten doppelklicken.

Klicken Sie auf die Registerkarte „Erstellen“.

Wählen Sie die Option „Unsicheren Code zulassen“.

Das Obige ist der Inhalt des [c#-Tutorials] C#-unsicherer Code. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn