Code unsafe (mot-clé unsafe) et pointeur fixe (mot-clé fixe) en C #

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é.
Insérez la description de l'image ici

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:
Insérez la description de l'image ici
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:
Insérez la description de l'image ici
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:
Insérez la description de l'image ici

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:
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_50188452/article/details/114961276
conseillé
Classement