مقدمه :

در این قسمت می خواهیم با یک سری از اصول اولیه ی شیء گرایی در سی شارپ کمی آشنا شویم. لازم به ذکر است ، بسیاری از مواردی که در این قسمت مطرح می شوند فقط برای آشنایی شما است و در آینده بیشتر بحث و مرور خواهند شد.


آشنایی با فضاهای نام (NameSpaces) :

فضاهای نام روشی برای مدیریت کد نویسی هستند. برای مثال آنها ایجاد شده اند تا تداخلی بین نام های توابع در برنامه شما رخ ندهد. این مساله در پروژه های بزرگ خود را نشان می دهد و ممکن است دو آیتم در یک پروژه نام های یکسانی را پیدا کنند. بدین وسیله این شانس تصادم و تداخل کاهش پیدا می کند. برای ایجاد یک فضای نام به صورت زیر عمل می شود:
کد:
namespace anyName
{
       ……..

      Class anyClassName
       {     
           ……….
       }

       …….

}
یکی از فضاهای نام پایه ای در دات نت فریم ورک ، فضای نام System می باشد. برای استفاده از آن می توان از کد زیر کمک گرفت :



کد:
using System;
تمام فضاهای نام به صورت پیش فرض public می باشند و در خارج از کد شما قابل دسترسی هستند. روش استفاده از آنها به صورت زیر است:



کد:
ProjectName.NameSpace.ClassName.MemberName
نکته :
اگر دقت کرده باشید هنگامی که کرسر ماوس را روی هر آیتمی در منوی autocomplete نگه می دارید و یا آنرا انتخاب می کنید یک راهنمای کوچک نمایش داده می شود که در حقیقت کامنت مربوط به آن تابع می باشد. روش نوشتن چنین کامنت حرفه ای که در منوهای ویژوال استودیو ظاهر شود به صورت زیر است که بهتر است (!) قبل از هر تابع یا خاصیت یا کلاس و .... نوشته شود



کد:
///<summary>
///
///
///</summary>
کلاس ها :

چون سی شارپ تمام سر و کارش با کلاس ها است بنابراین باید در مورد نحوه ی تعریف و استفاده از آنها تسلط کافی داشته باشیم.

یک پروژه ی جدید console در VS.NET باز کنید و نام آنرا در ابتدا ex03 وارد نمایید.
بعد از باز شدن پروژه ، از منوی Project گزینه ی Add class را انتخاب کنید تا کلاسی جدید به نام clsDate.cs را اضافه نماییم. ساختار فایل ایجاد شده توسط VS.NET به صورت زیر است :

کد:
کد:
using System;

namespace ex03
{
	/// <summary>
	/// Summary description for clsDate.
	/// </summary>
	public class clsDate
	{
		public clsDate()
		{
			//
			// TODO: Add constructor logic here (chashm!)
			//
		}
	}
}
تابع یا متد clsDate که در اینجا به صورت پیش فرض ایجاد شده است اصطلاحا سازنده (constructor) نام دارد. این تابع هر بار که یک شیء جدید از کلاس می سازیم به صورت خودکار اجرا می شود.

از این کلاس می خواهیم برای نمایش تاریخ/ ساعت و غیره استفاده کنیم.

برای مثال می خواهیم تاریخ جاری سیستم را به صورت یک خاصیت از این کلاس دریافت کنیم. برای این منظور کد زیر را به برنامه اضافه می نماییم:



کد:
public string currentSystemDate
		{
			get
			{
				return System.DateTime.Today.ToString() ; 
			}
		}
توضیح کد فوق :

خاصیتی را که می خواهیم از برنامه دریافت کنیم با کلمه ی کلیدی get معرفی می نماییم. هر چیزی که این قسمت برگرداند خروجی currentSystemDate خواهد بود. این دستور زبان که در بالا معرفی شد استاندارد است و در همه جا به یک صورت تعریف و بکار برده می شود. پس شکل آنرا به خاطر بسپارید.
از کلمه ی کلیدی return برای برگرداندن یک خروجی از خاصیت و یا تابع استفاده می شود.

برای استفاده از این خاصیت جدید ، در فایل Class1.cs که متد main برنامه ی ما در آنجا قرار دارد به صورت زیر عمل می کنیم :



کد:
clsDate m_var = new clsDate(); // initialize variable
	Console.WriteLine ( m_var.currentSystemDate ); 

      Console.ReadLine();//pause!
توضیح کد فوق :

برای استفاده از یک کلاس باید یک متغیر از آن را تعریف کنیم. در هر زبانی یک سری نوع های استاندارد مانند int و string و غیره وجود دارند. کلاس هم در حقیقت یک نوع داده ی بسیار بسیار قدرتمند به شمار می آید. برای تعریف یک متغیر از نوع جدید روش کار مانند سابق است. برای مثال زمانی که یک متغیر عدد صحیح را تعریف می کنید به صورت زیر عمل می شود :



کد:
int i=0;
برای تعریف یک متغیر از نوع داده ای که خودمان تعریف کرده ایم نیز باید به همین صورت عمل شود.



کد:
			clsDate m_var = new clsDate();
از کلمه ی کلیدی new اینجا به صورت استاندارد برای مقدار دهی اولیه به این متغیر جدید استفاده می نماییم.

سپس به روش دستیابی به این خاصیتی که به کلاس اضافه کرده ایم می رسیم.



کد:
m_var.currentSystemDate
کلا چه یک خاصیت و یا یک متد را به کلاس اضافه نماییم برای دستیابی به آن از عملگر نقطه پس از ذکر نام متغیر تعریف شده از نوع کلاس خود ، استفاده می نماییم. برای استفاده از خاصیت ها نیازی به آوردن () بعد از ذکر نام خاصیت نمی باشد.

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


توضیحی در مورد ; () System.DateTime.Today.ToString
استفاده از خواص :

شما به ویژگی های یک شیء با استفاده از خواص آن می توانید دسترسی پیدا کنید. یک property عضوی است که امکان دسترسی به ویژگی شیء یا کلاس را فراهم می کند. برای مثال طول یک رشته (string) ، سایز یک فونت ، عنوان یک فرم و نام یک مصرف کننده ، خاصیت هستند .
بسیاری از اشیاء ذاتی دات نت فریم ورک ، خواص مفید زیادی را به همراه دارند. برای مثال شیء DateTime را در نظر بگیرید. با استفاده از خاصیت Today آن می توان تاریخ جاری سیستم را بدست آورد. برای استفاده از یک خاصیت لازم است تا کلاس تعریف کننده شیء در برنامه مهیا باشد. منظور همان استفاده از فضای نام مربوطه می باشد. پس از وارد کردن فضای نام کلاس مورد نظر می توانید از شیء و خواص آن استفاده کنید. دو راه وجود دارد یا به صورت کامل تمام موارد باید ذکر شوند مانند System.DateTime.Now; و یا با وارد کردن فضای نام System کوتاه سازی صورت می گیرد.
برای استفاده از هر متد و یا شیء ایی در سی شارپ باید این شیء قابل دسترسی باشد. برای مثال شیء Console که از آن برای چاپ کردن خروجی بر روی صفحه ی نمایش استفاده می کنیم در فضای نام System واقع شده است. یا باید در ابتدای برنامه ذکر کرد using System ; و سپس خیلی راحت از این شیء استفاده کرد و یا می توان اینکار را انجام نداد و نوشت : System.Console و الی آخر. با ذکر فضای نام در ابتدا با استفاده از using می توان خلاصه نویسی کرد.


نتیجه ی نهایی مثال این فصل :

محتویات فایل Class1.cs :



کد:
using System;

namespace ex03
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
		  clsDate m_var = new clsDate(); // initialize variable
		  Console.WriteLine ( m_var.currentSystemDate ); 

              Console.ReadLine();//pause!  
		}
	}
}
محتویات فایل clsDate.cs که به برنامه اضافه کردیم:



کد:
using System;

namespace ex03
{
	/// <summary>
	/// Summary description for clsDate.
	/// </summary>
	public class clsDate
	{
		public clsDate()
		{
			//
			// TODO: Add constructor logic here
			//
		}

		public string currentSystemDate
		{
			get
			{
				return System.DateTime.Today.ToString() ; 
			}
		}


	}
}