Commencez par le configurer:
Cliquez avec le bouton droit sur le projet, sélectionnez Générer et cochez la case Autoriser le code non sécurisé.
Expliquez ce qu'est un code non sécurisé:
C # est un langage géré, vous n'avez pas besoin de gérer vous-même la mémoire. Certains mécanismes ont remplacé les pointeurs en C / C ++, tels que les références, l'hébergement et les événements. Mais C # n'élimine pas complètement les pointeurs comme le fait Java, donc les pointeurs peuvent toujours être utilisés sous C #. Lorsqu'un bloc de code utilise le modificateur unsafe, C # autorise l'utilisation de variables de pointeur dans la fonction. Le code non sécurisé ou le code non managé fait référence à des blocs de code qui utilisent des variables.
Utilisez le mot clé unsafe pour écrire du code unsafe
Étant donné que l'utilisation de pointeurs comporte des risques connexes, C # autorise uniquement les pointeurs à être utilisés dans des blocs de code spécialement marqués. Le mot-clé utilisé pour marquer le code n'est pas sûr. Le code suivant marque une méthode comme non sûre:
unsafe int GetSomeNumber()
{
//code that can use pointers
}
Exemples spécifiques:
Exemple 1:
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();
}
}
}
Résultat de l'opération:
Exemple 2:
/*使用指针检索数据值*/
using System;
namespace UnsafeCodeApplication
{
class Progarm
{
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); //(int)p取得到p的地址
}
Console.ReadKey();
}
}
}
Résultat de l'opération:
Exemple 3:
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();
}
}
}
résultat de l'opération:
Exemple 4:
/*使用指针访问数组元素*/
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe static void Main()
{
int[] list = {
10, 100, 1000 };
//因为int* ptr 和int[]list是不同类型的,
//指针ptr在内存中是不固定
//而数组地址是固定的
//所以要用fixed关键字来固定指针
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();
}
}
}
résultat de l'opération: