اشاره گرها در سی شارپ
در این سری از مقالات آموزشی سی شارپ قصد داریم به مبحث اشاره گر ها و کدهای نا امن بپردازیم. سی شارپ به کاربران خود اجازه استفاده از اشاره گر ها را در توابع و بلاک های برنامه میدهد.کد نا امن یا مدیریت نشده در واقع بلاک کدی است که در آن از اشاره گر ها استفاده شود. در ابتدا لازم به ذکر است که برای اجرای کدهایی که در ادامه خواهید دید باید تنظیمات ویژوال استودیوی خود را تغییر دهید. در منوی project به قسمت properties رفته و در سر برگ build تیک گزینه allow unsafe code را بزنید.
یک اشاره گر متغیری است که مقدار آن آدرس مستقیم متغیر دیگر در حافظه است. همانند سایر متغیر ها یا Constant ها شما باید یک اشاره گر را قبل از استفاده ابتدا تعریف کنید تا بتوانید آدرس ها را در آن ذخیره کنید. در حالت کلی تعریف یک اشاره گر به صورت زیر است :
type *variable-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
مثال زیر نحوه استاده از اشاره گر ها را نشان میدهد که با تعدیل کننده (modifier) unsafe اجرا میشوند :
using System; namespace ZeroToHero { 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(); } } }
(به تعدیل کننده unsafe در کنار نام متد main دقت شود).
خروجی کد بالا به صورت زیر خواهد بود :
Data is: 20 Address is: 99215364
همچنین میتوانید به جای اینکه کل متد خود را در بلاک unsafe بگذارید، قسمتی از برنامه را که در آن از اشاره گر استفاده میکنید در بلاک unsafe بگذارید. مثال بعدی بیانگر این مورد است. میتوان با استفاده از اشاره گر داده موجود در آدرس مورد نظر از حافظه را خواند. به مثال زیر توجه کنید :
using System; namespace ZeroToHero { 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 ZeroToHero { 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(); } } }
اشاره گر ها استفاده بسیار زیادی در برنامه نویسی دارند اما استفاده بیش از حد از آن باعث عدم خوانایی برنامه و گاها مشکلات در عیب یابی برنامه ایجاد میکنند. این مقاله دید ساده ای نسبت به اشاره گر ها به شما میدهد ولی شما میتوانید با استفاده از اشاره گرها به سرعت عملکرد برنامه خود بهبود ببخشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.