الثلاثاء، 16 فبراير 2010

إستخدام Using Block في سي شارب

تتميز الدوت نت .NET كغيرها من البيئات عالية المستوى بأننا لا نحتاج لإدارة الذاكرة فيها إذ يعمل ما يسمى بال Garbage Collector أو GC “ترجمتة الحرفية جامع النفايات” كل فترة من الوقت و يزيل الكائنات التي لم تعد تستخدم.

لكن خلال برمجتنا للتطبيقات نتعامل كثيرا مع كائنات غير مدارة (Unmanged) من قبل بيئة الدوت نت مثل بعض الدوال في نظام التشغيل او الإتصال مع قواعد البيانات أو الملفات المختلفة الموجودة على القرص الصلب و في هذه الحالة لا يعرف ال GC عن هذه الكائنات شيئا و بهذة الحالة و فرت لنا الدوت نت طريقة لنخبر بها ال GC  بأن يقوم أيضا بإزالة هذه الكائنات و التخلص منها وتحرير الذاكرة التي كانت مستخدمة من قبل هذه الكائنات.

و في حالة و جود هذه الكائنات غير المدارة أو كائنات مدارة تستخدم كائنات غير مدارة نحتاج في تعريفيها إلى الوراثة من واجهة IDisposable التي توجب عليك إضافة دالة Method بإسم Dispose و بهذه الدالة نكتب الكود اللازم لتحرير هذه الكائنات و احد الامثلة الشهيرة في هذه المجال هو كتابة الكود المسؤل عن الإتصال بقواعد البيانات حيث يكتب كما يلي

//نقوم بوارثة واجهة IDisposable
public class DataAccess:IDisposable
{
//نعتمد على الواجهات في إنشاء الكائنات الخاصة بنا حتى لا تكون عملية تغير البرنامج
//إلى أي قواعد بيانات أخرى عملية صعبة
public IDbConnection DbConnection { private set; get; }

public DataAccess()
{
//الحصول على إعدادات الوصول إلى قواعد البيات من ملف الإعدادات
var connectionString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
// إنشاء كائن الأتصال بقاعدة بيانات SQL
DbConnection = new SqlConnection(connectionString);
}
// دوال أخرى

//الدالة التي تفرضها علينا واجهة IDisposable
public void Dispose()
{
// سيتم تنفيذ الكود الموجود هنا عند منادة هذه الدالة أو عند إستخدامها مع Using Block
DbConnection.Close();
//نقوم هنا بكتابة الكود المسؤل عن تحرير المصادر غير المدارة مثل إغلاق الإتصال بقواعد البيانات
DbConnection.Dispose();
}
}



عندها نستطيع إستخدام ال Using Block إذ أننا لا نستطيع أستخدامة إلا إذا كان الفئة Class  التي نستخدمها معه قد و رثت من واجهة IDisposable  و لأريكم كيف يتم إستخدامه تابعو الكود التالي:




class Program
{
static void Main(string[] args)
{
//ننشئ كائن من الفئة التي ترث IDisopoable
using (var Db = new DataAccess())
{
//نكتب العمل الذي نريده
// Do Some Code Here
}// عن الخروج من هذه المنطقة ستجبر الدوت نت الفئة على مناداة دالة Disopose
// حتى لو حدث أي عطل خارج عن إرادتنا
}
}



و الأن بعدما تعلمت كيفية إستخدامه أرجو منك تطبيقها و الإستفادة منها في الحيات العملية و ان تكون ممن يعرفون كيف يستخدم الميزة المناسبة في المكان المناسب.