یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتریادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
کدهای نا امن(Unsafe Code) مربوط به C#
کدهای نا امن
C# زمانی که تابعی از بلوک کد توسط اصلاحکنندهی نا امن نشان شده است، امکان استفاده از متغیرهای اشارهگر را در این تابع فراهم کرده است. کد نا امن یا کد مدیریت نشده بلوکی از کد است که از یک متغیر اشارهگر استفاده میکند.
جهت اجرای برنامههای بیان شده در این فصل در codingground لطفاً تنظیمات کامپایل را در
Project >> Compile Options >> Compilation Command
بر روی mcs *.cs -out:main.exe -unsafe" قرار دهید.
اشارهگرها
اشارهگرها متغیرهایی هستند که مقدار آنها آدرس متغیر دیگر یا همان آدرس مستقیم مکان حافظه است. شبیه به متغیرها یا ثابتهای دیگر، جهت ذخیرهسازی هر آدرسی از متغیر قبل از آن که بتوانید از اشارهگر استفاده کنید، باید آن را اعلان کنید.
فرم کلی اعلان اشارهگرها به صورت زیر است:
type *var-name;
int *ip;/* pointer to an integer */ double *dp;/* pointer to a double */ float *fp;/* pointer to a float */ char *ch/* pointer to a character */
در مثال زیر با استفاده از اصلاحکنندهی نا امن، کاربرد اشارهگرها در C# نشان داده شده است:
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(); } } }
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
Data is: 20 Address is: 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(); } } }
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
Data is: 20 Data is: 20 Address is: 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("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } }
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10
دسترسی به عناصر آرایه با استفاده از یک اشارهگر
در C# اسم یک آرایه و اشارهگر یک نوع از داده مانند دادهی آرایه، نوع متغیر یکسانی ندارند. برای مثال int *p و int[] 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) /* let us have 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(); } } }
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
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
کامپایل کدهای نا امن
جهت کامپایل کردن این کدها باید سوئیچ خط فرمان /unsafe را به همراه کامپایلر خط فرمان مشخص کنید.
برای مثال اگر بخواهید برنامهی prog1.cs که شامل کد نا امن است را از خط فرمان کامپایل کنید، باید از دستور زیر استفاده کنید:
csc /unsafe prog1.cs
اگر از Visual Studio IDE استفاده میکنید باید در properties پروژهی خود، امکان استفاده از کد نا امن را فراهم کنید.
برای انجام این کار:
- بر روی گرهی properties در Solution Explorer دو بار کلیک کنید تا project properties باز شود.
- بر وی تب build کلیک کنید.
- “Allow unsafe code” را انتخاب کنید.