دسته بندی وبلاگ

آشنايي با كلاسها در سی شارپ  #C

آشنايي با كلاسها در سی شارپ #C

در اين درس با كلاسها در زبان #C آشنا خواهيد شد. اهداف اين درس به شرح زير مي‌باشند :
 پياده‌سازي سازنده‌ها (Constructors) 
 درك تفاوت بين اعضاي نمونه (Instance) و استاتيك (Static)
 آشنايي با تخريب  كننده‌ها (Destructors)
 آشنايي با اعضاي كلاسها
 انواع کلاس ها در سی شارپ

  در تمامي مطالبي كه در اين سايت مشاهده كرده‌ايد، برنامه‌ها داراي كلاس‌هايي بوده‌اند. در حال حاضر بايد درك نسبی از كلاسها و چگونگي ايجاد و كار با آنها را داشته باشيد. در اين درس مروری بر آموخته‌هاي قبلي از كلاسها خواهيم كرد و با اعضاي كلاسها نیز آشنا خواهیم شد.

يك كلاس با استفاده از كلمه كليدي class كه بدنبال آن نام كلاس آمده باشد، اعلان مي‌گردد و اعضاي اين كلاس درون {} اعلان مي‌گردند. هر كلاس داراي سازنده‌اي مي‌باشد كه در هربار ايجاد نمونه‌اي جديد از آن كلاس، بصورت خودكار فراخواني مي‌گردد. هدف از سازنده، تخصيص‌دهي اعضاي كلاس در زمان ايجاد نمونه‌اي جديد از كلاس است. سازنده‌ها داراي مقادير بازگشتي نبوده و همواره نامي مشابه نام كلاس دارند. مثال 1-7 نمونه‌اي از يك كلاس را نشان مي‌دهد.

كد:

// Namespace اعلان
using System;

class OutputClass
{
string myString;
// سازنده
public OutputClass(string inputString)
{
myString = inputString;
}
 // متد نمونه
public void printString()
{
Console.WriteLine("{0}", myString);
}
// تخريب كننده
~OutputClass()
{
// روتيني جهت آزادسازي برخي از منابع سيستم
}
}
// كلاس آغازين برنامه
class ExampleClass
{
// آغاز اجراي برنامه
public static void Main()
{
// OutputClass نمونه‌اي از
OutputClass outCl = new OutputClass("This is printed by the output class.");
 // Output فراخواني متد كلاس
outCl.printString();
}
}

در مثال 1-7 دو كلاس ديده مي‌شوند. كلاس بالايي، كلاس OutPutClass، داراي سازنده، متد نمونه و يك تخريب كننده است. همچنين اين كلاس داراي فيلدي با نام myString است. توجه نماييد كه چگونه سازنده اين كلاس اعضاي آنرا تخصيص‌دهي(مقداردهي) مي‌نمايد. در اين مثال، سازنده كلاس رشته‌ ورودي (inputString) را بعنوان آرگومان خود دريافت مي‌نمايد. سپس اين مقدار داخل فيلد كلاس يعني myString كپي مي‌گردد.

    همانطور كه در ExampleClass مشاهده مي‌نماييد، استفاده از سازنده الزامي نمي‌باشد. در اين مورد سازنده پيش فرض ايجاد مي‌گردد. سازنده پيش فرض، سازنده‌ اي بدون هيچ نوع آرگوماني است. البته شايان ذكر است كه سازنده‌هايي بدون آرگومان هميشه مورد استفاده نبوده و مفيد هم نيستند . جهت كارآمد كردن بيشتر سازنده‌هاي بدون آرگومان بهتر است آنها را با تخصيص‌دهنده (Initializers) پياده‌سازي نماييد. به مثال زير در اين زمينه توجه نماييد :


public OutputClass() : this("Default Constructor String") { }


فرض كنيد اين عبارت در كلاس OutPutClass در مثال 1-7 قرار داشت. اين سازنده پيش فرض به يك تخصيص‌دهنده همراه شده است. ":" ابتداي تخصيص‌دهنده را مشخص ‌مي‌نما‌يد، و به دنبال آن كلمه كليدي this آمده است. كلمه كليدي this به شيء كنوني اشاره مي‌نمايد. استفاده از اين كلمه، فراخواني به سازنده شيء كنوني كه در آن تعريف شده است، ايجاد مي‌كند. بعد از كلمه كليدي this ليست پارامترها قرار مي‌گيرد كه در اينجا يك رشته است. عملي كه تخصيص‌دهنده فوق انجام مي‌دهد، باعث مي‌شود تا سازنده OutPutClass رشته‌اي را بعنوان آرگومان دريافت نمايد. استفاده از تخصيص‌دهنده‌ها تضمين مي‌نمايند كه فيلدهاي كلاس شما در هنگام ايجاد نمونه‌اي جديد مقدار‌دهي مي‌شوند.

مثال فوق نشان داد كه چگونه يك كلاس مي‌تواند سازنده‌هاي متفاوتي داشته باشد. سازنده‌اي كه فراخواني مي‌شود، به تعداد و نوع آرگومانهايش وابسته است.

در زبان #C ، اعضاي كلاسها دو نوع مي‌باشند : اعضاي نمونه و استاتيك. اعضاي نمونه كلاس متعلق به رخداد خاصي از كلاس هستند. هربار كه شي‌اي از كلاسي خاص ايجاد مي‌كنيد، در حقيقت نمونه‌ جديدي از آن كلاس ايجاد كرده‌ايد. متد ()Main  در كلاس ExampleClass نمونه جديدي از OutPutClass را تحت نام outCl ايجاد مي‌نمايد. مي‌توان نمونه‌هاي متفاوتي از كلاس OutPutClass را با نامهاي مختلف ايجاد نمود. هر يك از اين نمونه‌های مجزا بوده و به تنهايي عمل مي‌كنند. به عنوان مثال اگر دو نمونه از كلاس OutPutClass همانند زير ايجاد نماييد :

كد:

OutputClass oc1 = new OutputClass("OutputClass1");
OutputClass oc2 = new OutputClass("OutputClass2");

با اين اعلان، شما دو نمونه از كلاس OutputClass را ايجاد كرده‌ايد كه هر يك از آنها داراي فيلد myString و متد ()printString هستند و اين فيلدها و متدها كاملاً از يكديگر مجزا مي‌باشند. به بيانی ديگر، درصورتيكه عضوي از كلاس استاتيك باشد از طريق ساختار نوشتاري .
قابل دسترس خواهد بود. در اين مثال نمونه‌ها oc1 و oc2 هستند. فرض كنيد كلاس OutPutClass داراي متد استاتيك زير باشد :

كد:

public static void staticPrinter()
{
  Console.WriteLine("There is only one of me.");
}


اين متد را از درون متد ()Main  به صورت زير مي‌توانيد فراخواني نماييد :

كد:

OutputClass.staticPrinter();

اعضاي استاتيك يك كلاس تنها از طريق نام آن كلاس قابل دسترس مي‌باشند و نه از طريق نام نمونه ايجاد شده از روي كلاس. بدين ترتيب براي فراخواني اعضاي استاتيك يك كلاس نيازي به ايجاد نمونه از روي آن كلاس نمي‌باشد. همچنين تنها يك كپي از عضو استاتيك كلاس، در طول برنامه موجود مي‌باشد. يك مورد استفاده مناسب از اعضاي استاتيك در مواردي است كه تنها يك عمل بايد انجام گيرد و در انجام اين عمل هيچ حالت مياني وجود نداشته باشد، مانند محاسبات رياضي. در حقيقت، .Net Framework BCL خود داراي كلاس Math مي‌باشد كه از اعضاي استاتيك بهره مي‌برد.

نوع ديگر سازنده‌ها، سازنده‌هاي استاتيك هستند. از سازنده‌هاي استاتيك جهت مقدار‌دهي فيلدهاي استاتيك يك كلاس استفاده مي‌شود. براي اعلان يك سازنده استاتيك تنها كافيست كه از كلمه كليدي static در جلوي نام سازنده استفاده نماييد. سازنده استاتيك قبل از ايجاد نمونه جديدي از كلاس، قبل از فراخواني عضو استاتيك و قبل از فراخواني سازنده استاتيك كلاس مشتق شده، فراخواني مي‌گردد. اين سازنده‌ها تنها يكبار فراخواني مي‌شوند.

OutPutClass همچنين داراي يك تخريب‌كننده (Destructor) است. تخريب‌كننده‌ها شبيه به سازنده‌ها هستند، با اين تفاوت كه در جلوي خود علامت "~" را دارا مي‌باشند. هيچ پارامتري دريافت نكرده و هيچ مقداري باز نمي‌گردانند. از تخريب‌كننده‌ها مي‌توان در هر نقطه از برنامه كه نياز به آزادسازي منابع سيستم كه در اختيار كلاس يا برنامه است، استفاده نمود. تخريب‌كننده‌ها معمولاً زماني فراخواني مي‌شوند كه Garbage Collector زبان C# تصميم به حذف شيء مورد استفاده برنامه از حافظه و آزادسازي منابع سيستم، گرفته باشد. (Garbage Collector يا GC، يكي از امكانات .Net Framework مخصوص زبان C# است كه سيستم بصورت اتوماتيك اقدام به آزادسازي حافظه و باز گرداندن منابع بلا استفاده به سيستم مي‌نمايد. فراخواني GC بصورت خودكار رخ مي‌دهد مگر برنامه‌نويس بصورت صريح از طريق تخريب‌كننده‌ها آنرا فراخواني نمايد. در مباحث پيشرفته‌تري كه در آينده مطرح مي‌كنيم خواهيد ديد كه در چه مواقعي نياز به فراخواني تخريب‌كننده‌ها بصورت شخصي داريد.)

تا كنون، تنها اعضاي كلاس كه با آنها سر و كار داشته‌ايد، متدها، فيلدها، سازنده‌ها و تخريب‌كننده‌ها بوده‌اند در زير ليست كاملي از انواعي را كه مي‌توانيد در كلاس از آنها استفاده نماييد آورده شده است :

• Constructors
• Destructors
• Fields
• Methods
• Properties
• Indexers
• Delegates
• Events
• Nested Classes

مواردي كه در اين درس با آنها آشنا نشديد، حتماً در درس‌هاي آينده مورد بررسي قرار خواهند گرفت.

خلاصه مطلب :
در اين درس نحوه اعلان سازنده‌هاي استاتيك و نمونه را فرا گرفتيد و با نحوه مقداردهي به فيلدها آشنا شديد. زمانيكه نياز به ايجاد نمونه از روي شيء نباشد از اعضاي استاتيك كلاس استفاده مي‌كنيم. با استفاده از تخريب‌كننده‌ها مي‌توانيد منابع بلا استفاده را به سيستم باز گردانيد.