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

Codice non sicuro di C#

Quando un blocco di codice utilizza unsafe Quando il modificador è utilizzato come marcatura, C# permette l'uso di variabili puntatore nelle funzioni.Codice non sicuroO codice non gestito è quello che utilizzaPuntatoreBlocco di codice della variabile.

Variabile puntatore

Puntatore È una variabile che contiene l'indirizzo di un altro variabile, ovvero l'indirizzo diretto della posizione di memoria. Come altre variabili o costanti, devi dichiarare il puntatore prima di memorizzare l'indirizzo di un'altra variabile.

La forma generale di dichiarazione di una variabile puntatore è:

type* var-name;

Di seguito sono riportati degli esempi di dichiarazione di tipi di puntatore:

ExampleDescrizione
int* pp è un puntatore a un intero.
double* pp è un puntatore a un numero a virgola mobile a precisione doppia.
float* pp è un puntatore a un numero a virgola mobile.
int** pp è un puntatore a un puntatore a interi.
int*[] pp è un array di puntatori a interi.
char* pp è un puntatore a carattere.
void* pp è un puntatore a tipo sconosciuto.

Quando si dichiarano più puntatori nello stesso dichiarativo, l'asterisco * viene scritto solo con il tipo di base; non viene utilizzato come prefisso per ogni nome di puntatore. Ad esempio:

int* p1, p2, p3; // corretto  
int* p1, *p2, *p3; // sbagliato

Ecco un esempio che illustra l'uso di in C#: unsafe L'uso del puntatore come修饰符:

using System;
namespace UnsafeCodeApplication
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            int var = 20;
            int* p = &var;
            Console.WriteLine("I dati sono: {0} ", var);
            Console.WriteLine("L'indirizzo è: {0}", (int)p);
            Console.ReadKey();
        }
    }
}

When the above code is compiled and executed, it will produce the following results:

I dati sono: 20
L'indirizzo è: 99215364

Puoi anche non dichiarare l'intero metodo come codice non sicuro, ma solo una parte del metodo come codice non sicuro. Ecco un esempio che illustra questo punto.

Recupera i valori dei dati utilizzando i puntatori

Puoi usare ToString() Il metodo recupera i dati memorizzati nella posizione referenziata dal variabile puntatore. Ecco un esempio che illustra questo punto:

using System;
namespace UnsafeCodeApplication
{
   class Program
   {
      public static void Main()
      {
         unsafe
         {
            int var = 20;
            int* p = &var;
            Console.WriteLine("I dati sono: {0} ", var);
            Console.WriteLine("I dati sono: {0} ", p->ToString());
            Console.WriteLine("L'indirizzo è: {0} ", (int)p);
         }
         Console.ReadKey();
      }
   }
}

When the above code is compiled and executed, it will produce the following results:

I dati sono: 20
I dati sono: 20
L'indirizzo è: 77128984

Passaggio di puntatore come parametro del metodo

Puoi passare variabili puntatore come parametri del metodo. Ecco un esempio che illustra questo punto:

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();
      }
   }
}

When the above code is compiled and executed, it will produce the following results:

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

Access array elements using pointers

In C#, the array name and a pointer to the data type of the array are different variable types. For example, int *p and int[] p are different types. You can increment the pointer variable p because it is not fixed in memory, but the array address is fixed in memory, so you cannot increment the array p.

Therefore, if you need to use pointer variables to access array data, you can use it as we usually do in C or C++ fixed Keywords to fix pointers.

The following example demonstrates this:

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[] list = {10, 100, 200};
         fixed(int *ptr = list)
         /* Display array address in pointer */
         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();
      }
   }
}

When the above code is compiled and executed, it will produce the following results:

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

Compile unsafe code

To compile unsafe code, you must switch to the command line compiler specified /unsafe Command line.

Ad esempio, per compilare un programma chiamato prog1.cs che contiene codice non sicuro, inserisci il comando: }}

csc /unsafe prog1.cs

Se stai utilizzando l'IDE Visual Studio, devi abilitare il codice non sicuro nelle proprietà del progetto.

I passaggi sono i seguenti:

  • Per aprire, fare doppio clic sul nodo Proprietà (properties) nel gestore risorse (Solution Explorer)Proprietà del progetto (project properties)

  • Clicca Compila Scheda.

  • Scegli un'opzione"Permetti codice non sicuro"。