از این قسمت به بعد می خواهیم نگاهی دقیق تر به بحث شیء گرایی در سی شارپ بیاندازیم؛ همانند فضاهای نام ، کلاس ها ، ارث بری ، پلی مرفیسم و غیره.

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

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex24 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :



کد:
// Namespace Declaration
using System;

namespace ex24
{
	namespace tutorial 
	{
		// Program start class
		class NamespaceCSS 
		{
			// Main begins program execution.
			public static void Main() 
			{
				// Write to console
				Console.WriteLine("This is the new Namespace.");
			}
		}
	}

}
توضیحاتی در مورد کد فوق :
یکی از روش های مناسب برای معرفی فضاهای نام ، ارائه ی آنها به صورت سلسله مراتبی می باشد. قسمت های عمومی تر در بالا و قسمت های اختصاصی تر در فصاهای نام داخلی تر قرار داده می شوند. این روش به معرفی فضاهای نام تو در تو منتهی می شود (nested namespaces) ، همانند مثال بالا.

کد فوق را به صورت زیر با استفاده از عملگر دات (.) می توان خلاصه نویسی کرد و نتیجه با قبل تفاوتی ندارد:



کد:
// Namespace Declaration
using System;

namespace ex24.tutorial 
{
		// Program start class
		class NamespaceCSS 
		{
			// Main begins program execution.
			public static void Main() 
			{
				// Write to console
				Console.WriteLine("This is the new Namespace.");
			}
		}
}
طریقه ی فراخوانی اعضای فضاهای نام :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex25 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :




کد:
// Namespace Declaration
using System;

namespace ex25 
{
	// nested namespace
	namespace tutorial 
	{
		class myExample1 
		{
			public static void myPrint1() 
			{
			  Console.WriteLine("calling another namespace member1.");
			}
		}
	}

	// Program start class
	class NamespaceCalling 
	{
		// Main begins program execution.
		public static void Main() 
		{
			// Write to console
			tutorial.myExample1.myPrint1(); 
			tutorial.myExample2.myPrint2(); 
		}
	}
}

// same namespace as nested namespace above
namespace ex25.tutorial 
{
	class myExample2 
	{
		public static void myPrint2() 
		{
      		Console.WriteLine("calling another namespace member2.");
		}
	}
}
توضیحاتی در مورد کد فوق :
در کد فوق نحوه ی استفاده از اعضای تعریف شده در فضاهای نام را می توان مشاهده کرد. نحوه ی استفاده از آنها همانطور که در قسمت های قبل نیز گفته شد به صورت زیر است :



کد:
ProjectName.NameSpace.ClassName.MemberName
برای مثال در فصای نام tutorial کلاس myExample1 قرار دارد و داخل آن متد myPrint1 تعریف شده است. پس نحوه ی دسترسی به متد آن به صورت زیر است :




کد:
			tutorial.myExample1.myPrint1();
کلاس های myExample1 و myExample2 هر دو به یک فضای نام (ex25.tutorial) تعلق دارند ، هر چند جدا از هم نوشته شده اند. حتی آنها را با حفظ سلسله مراتب خودشان می توان در فایلهای جداگانه ای نیز نوشت.



استفاده از using :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex26 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

کد:
کد:
// Namespace Declaration
using System;
using ex26.tutorial;

// Program start class
class UsingDirective 
{
	// Main begins program execution.
	public static void Main() 
	{
		// Call namespace member
		myExample.myPrint(); 
	}
}

// C#‎ Namespace
namespace ex26.tutorial 
{
	class myExample 
	{
		public static void myPrint() 
		{
			Console.WriteLine("Example of using a using directive.");
		}
	}
}
توضیحاتی در مورد کد فوق :

همانند مثال بالا ، برای خلاصه نویسی می توان از کلمه ی using به همراه نام namespace مورد نظر استفاده کرد. برای مثال اگر متد WriteLine را بخواهیم کامل بنویسیم به صورت زیر است :

کد:
System.Console.WriteLine(...);
اما با قید کردن و الحاق کردن فضای نام آن ، دیگر نیازی به ذکر System در ابتدای آن نیست.


نکته :

باز هم می توان خلاصه نویسی بیشتری را ارائه داد



کد:
using csTut = ex26.tutorial.myExample; // alias
در این صورت تنها کافی است متد کلاس تعریف شده در آنرا به صورت زیر فراخوانی کنیم :



کد:
csTut.myPrint();