نوشتن کدهای نا امن در سی شارپ


همان طور که می دانید در برنامه های تحت دات نت به صورت نرمال وظیفه تخصیص حافظه و آزادسازی آن بر دوش برنامه نویس نیست و به کدهایی که به زبان سی شارپ نوشته می شوند به اصطلاح «کدهای مدیریت شده» می گویند. در مقابل کدهای مدیریت شده، کدهای نا امن یا مدیریت نشده قرار دارند. خیلی از برنامه نویسان سی شارپ شاید هیچ وقت از این قابلیت استفاده نکنند و خیلی ها فکر می کنند نوشتن این کدها تخصص خاصی می خواهد و پیچیدگی های زیادی دارد. پس از خواندن این مقاله خواهید فهمید که نوشتن کدهای نا امن آن قدرها هم سخت و ترسناک نیست.

در کدهای نا امن (=Unsafe) یا مدیریت نشده (=Unmanaged) شما قادر به تعریف و استفاده از اشاره گرها (=Pointer) هستید. اما سوال اینجاست که کدهای نا امن به چه دردی می خورند!؟ اگر ما قصد دسترسی مستقیم به حافظه یا ارتباط مستقیم با سیستم عامل داشته باشیم و یا بخواهیم الگوریتم خاصی را پیاده سازی کنیم، اشاره گرها قدرت و انعطاف زیادی به ما خواهند داد. من در اینجا قصد ندارم در مورد مزایا یا معایب کدهای نا امن و یا ساختار آن ها در دات نت صحبت کنم، فقط می خواهم با مثال های ساده نحوه نوشتن این کدها را به شما آموزش دهم.

در سی شارپ با استفاده از کلمه کلیدی unsafe، می توانید به صورت صریح به کامپایلر بگوئید که قصد نوشتن کدهای نا امن را دارید. نوشتن کدهای نا امن در سی شارپ مثل این است که شما بخواهید در میان کدهای سی شارپ از کدهای زبان C استفاده کنید! بهتر است برای درک موضوع به مثال اول توجه کنید :

using System;
class sample {
	public static void Main() {
	        int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + data);
		Console.WriteLine("Address is " + (int)Pdata);
	}
}

توضیح : در برنامه بالا متغیری به نام data ساختیم از نوع صحیح، در خط بعد با استفاده از * اشاره گری از نوع صحیح (int) به متغیر data ساختیم. عملگر & آدرس متغیر را در حافظه بر می گرداند.

برنامه بالا یک نمونه استفاده از کدهای نا امن است. خب، برنامه را اجرا کنید. کامپایلر به شما خطای زیر را می دهد.

Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.
um1.cs(6,8): error CS0214: Pointers may only be used in an unsafe context
um1.cs(8,27): error CS0214: Pointers may only be used in an unsafe context

به صورت نرمال، کامپایلر سی شارپ به شما اجازه استفاده از کدهای نا امن را نمی دهد. شما باید با استفاده از کلمه unsafe به کامپایلر سی شارپ بفهمانید که قصد نوشتن کدهای نا امن را دارید. حالا برنامه بالا را طوری تغییر می دهیم که دیگر خطایی مشاهده نکنیم.

using System;
class sample {
	public unsafe static void Main() {
	        int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + data);
		Console.WriteLine("Address is " + (int)Pdata);
	}
}

در برنامه بالا، تابع Main با کلمه unsafe همراه شده است. این بدین معنی است که تمامی کدهای داخل این تابع به صورت نا امن نوشته شده اند. شاید این سئوال برای شما هم پیش بیاید که چطور می توان فقط قسمتی از کدهای تابع Main را به صورت نا امن نوشت. خب، حالا برنامه بالا طوری تغییر می دهیم که فقط بدنه تابع به صورت نا امن اجرا شود و همچنین این بار به جای مقدار متغیر data، مقداری که Pdata به آن اشاره می کند روی صفحه چاپ شود.

using System;
class sample {
	public static void Main() {
	   unsafe {
                int data = 10;
		int* Pdata = &data;
		Console.WriteLine("Data is " + Pdata->ToString());
		Console.WriteLine("Address is " + (int)Pdata);
	   }
       }
}

در برنامه بالا با استفاده از کلمه unsafe فطعه ای از کدها را به صورت نا امن نوشتیم. همچنین مقداری که Pdata به آن اشاره می کند را با تابع ToString به خروجی فرستادیم.

در مقالات بعدی بیشتر با کدهای unsafe آشنا خواهیم شد و مثال های کاربردی تری ارائه خواهیم داد. برای اینکه ایم مقالات را از دست ندهید مشترک فراسان شوید. چگونه مشترک فرسان شوم!؟

farasun.wordpress.com

Subcribe to Farasun feedمشترک فراسان شويد

farasun.wordpress.com

مطالب مرتبط :

طراحی سایت، ثبت دامین، میزبانی فضا و بهینه سازی سایت در موتورهای جستجو

Advertisements