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

دليل أساسي C#

دليل متقدم C#

C# التوجيه نحو الأشياء (OOP)

الكود الغير آمن C#

عندما يستخدم الكود unsafe C# يسمح باستخدام متغيرات المؤشر في الدوال عند استخدام ميزة التعديل.الكود غير الآمنأو الكود غير المدارة هو الذي يستخدمالمؤشرالكود الخاص بالمتغيرات.

متغير المؤشر

المؤشر هي متغير تحتوي على عنوان آخر متغير، أي عنوان الموقع المباشر للذاكرة. مثل أي متغير آخر أو ثابت، يجب عليك إعلان المؤشر قبل تخزين عنوان آخر متغير فيه.

الشكل العام لإعلان متغيرات المؤشر هو:

type* var-name;

هذه أمثلة على إعلانات أنواع المؤشرات:

مثالالوصف
int* pp هو مؤشر على الأعداد الصحيحة.
double* pp هو مؤشر على الأعداد المزدوجة الدقة.
float* pp هو مؤشر على الأعداد العشرية.
int** pp هو مؤشر على مؤشرات الأعداد الصحيحة.
int*[] pp هو مصفوفة ذاتية من مؤشرات على الأعداد الصحيحة.
char* pp هو إشارة إلى حرف.
void* pp هو إشارة إلى نوع غير معروف.

عند إعلان عدة إشارات في نفس الت声明، يتم كتابة نجمة * فقط مع النوع الأساسي، وليس كمقدمة لكل اسم إشارة. على سبيل المثال:

int* p1, p2, p3; // صحيح  
int* p1, *p2, *p3; // خطأ

يوضح هذا المثال كيف تم استخدامها في C#: unsafe استخدام الإشارات كمعزز:

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

عندما يتم ترميز وتنفيذ هذا الكود، سيظهر النتيجة التالية:

البيانات هي: 20
عنوان هو: 99215364

يمكنك أيضًا عدم إعلان الطريقة بأكملها ككود غير آمن، بل يمكنك إعلان جزء من الطريقة فقط ككود غير آمن. يوضح هذا المثال ذلك.

استخدام الإشارات لاسترجاع قيمة البيانات

يمكنك استخدام ToString() يبحث الطريقة عن البيانات المخزنة في الموقع الذي يشير إليه متغير الإشارة. يوضح هذا المثال ذلك:

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

عندما يتم ترميز وتنفيذ هذا الكود، سيظهر النتيجة التالية:

البيانات هي: 20
البيانات هي: 20
عنوان هو: 77128984

إرسال إشارة إلى الدالة كمعامل

يمكنك إرسال متغيرات يشير إلىها إلى الدالة كمعاملات الدالة. يوضح هذا المثال ذلك:

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("بعد تبادل: var1: {0}، var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

عندما يتم ترميز وتنفيذ هذا الكود، سيظهر النتيجة التالية:

قبل تبادل: var1: 10، var2: 20
بعد تبادل: var1: 20، var2: 10

استخدام البايت لاستقبال عناصر القائمة

في C#، اسم القائمة وأي بايت يوجه إلى بيانات القائمة هو نوع متغير مختلف. على سبيل المثال، int *p و int[] p أنواع مختلفة. يمكنك زيادة متغير البايت p لأنه غير ثابت في الذاكرة، ولكن عنوان القائمة ثابت في الذاكرة، لذلك لا يمكنك زيادة القائمة p.

لذلك، إذا كنت بحاجة إلى استخدام متغير البايت لاستقبال بيانات القائمة، يمكنك استخدام كما نستخدم عادة في C أو C++، fixed كلمات المفتاح لتثبيت البايت

في المثال التالي، يتم عرض هذا النقطة:

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("عنوان قائمة [{0}]={1}", i, (int)(ptr + i));
            Console.WriteLine("قيمة قائمة [{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

عندما يتم ترميز وتنفيذ هذا الكود، سيظهر النتيجة التالية:

عنوان قائمة [0] = 31627168
قيمة قائمة [0] = 10
عنوان قائمة [1] = 31627172
قيمة قائمة [1] = 100
عنوان قائمة [2] = 31627176
قيمة قائمة [2] = 200

ترميز رمز غير آمن

للترميز رمز غير آمن، يجب عليك التبديل إلى محرر سطر الأوامر المحدد /unsafe سطر الأوامر

على سبيل المثال، لإعداد برنامج يحتوي على كود غير آمن يُدعى prog1.cs، يجب عليك إدخال الأمر التالي في سطر الأوامر:

csc /unsafe prog1.cs

إذا كنت تستخدم IDE Visual Studio، فعليك تمكين الكود غير الآمن في خصائص المشروع.

الخطوات التالية:

  • لفتح، اضغط مرتين على عقدة مدير الموارد (Solution Explorer) في خصائص (properties)خصائص المشروع (project properties)

  • انقر بناء العلامة tab

  • اختر الخيار"السماح بالكود غير الآمن".