درس ششم – Namespaces
اهداف این درس به شرح زیر میباشد :
ü آشنایی با Namespace در زبان C#
ü چگونگی استفاده از هدایتگر using (using directive)
ü چگونگی استفاده از هدایتگر alias (alias directive)
ü اعضای یک Namespace چه هستند؟
اگر به خاطر داشته باشید، در درس اول، در ابتدای برنامه از using System; استفاده نمودیم. با استفاده از این کد، امکان دسترسی ما به اعضای Namespace مورد نظر، که در اینجه System است، فراهم میشد. پس از مطالعه این درس، مطالب بسیاری درباره هدایتگر using فرا خواهید گرفت.
Namespace ها، المانهای زبان C# هستند که شما را در سازماندهی کردن برنامه، کمک میکنند. پیادهسازی Namespace ها در کد برنامه بسیار مفید است چراکه از ایجاد مشکلات مربوط به استفاده مجدد کد، پیشگیری مینماید.
چگونگی ایجاد Namespace
به مثال زیر توجه نمایید.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
// کلاس آغازین برنامه
class NamespaceCSS
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
مثال 1-6 چگونگی ایجاد یک Namespace را نشان میدهد. در این مثال ما با قرار دادن کلمه کلیدی namespace در جلوی csharp-persian یک Namespace جدید ایجاد نمودیم. مثال 2-6، Namespace های تودرتو را نشان میدهد.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
namespace tutorial
{
// کلاس آغازین برنامه
class NamespaceCSS
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
}
Namespace ها این امکان را فراهم میآورند تا سیستمی جهت سازماندهی کدهای خود ایجاد نمایید. یک روش مناسب جهت سازماندهی Namespace های برنامه، استفاده از یک سیستم سلسله مراتبی است. بدین ترتیب که Namespace های عمومی را در بالای این ساختار قرار داده و هر چه در این ساختار پاینتر میآییم، Namespace های تخصصیتر قرار میگیرند. این سیستم سلسله مراتبی بوسیله Namespace های تودرتو قابل پیادهسازی هستند. این پیادهسازی در مثال 2-6 نشان داده شده است. با قرار دادند کدهای خود در Namespace های فرعی میتوانید کدهای خود را سازماندهی نمایید.
// Namespace اعلان
using System;
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
// کلاس آغازین برنامه
class NamespaceCSS
{
//آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
Console.WriteLine("This is the new C# Persian Namespace.");
}
}
}
مثال 3-6 روش دیگر ایجاد Namespace های تودرتو را نشان میدهد. همانطور که در این مثال مشاهده مینمایید، Namespace تودرتو با قرار دادن عملگر نقطه "." در بین csharp-persian و tutorial ایجاد شده است. این مثال از نظر کارآیی دقیقاً همانند مثال 2-6 است و از نظر پیادهسازی آسانتر از آن میباشد.
فراخوانی اعضای یک Namespace
// Namespace اعلان
using System;
namespace csharp-persian
{
// namespace تودرتو
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine("First Example of calling another namespace member.");
}
}
}
// کلاس آغازین برنامه
class NamespaceCalling
{
// آغاز اجرای برنامه
public static void Main()
{
// چاپ خروجی در کنسول
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}
//تودرتو بالا Namespaceمشابه Namespace
namespace csharp-persian.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine("Second Example of calling another namespace member.");
}
}
}
مثال 4-6 چگونگی فراخوانی اعضای Namespace نشان میدهد. در ابتدای مثال 4-6، یک Namespace تودرتو اعلان شده است، tutorial درون csharp-persian، که دارای کلاس myExample1 و متد myPrint1 میباشد. متد Main() این متد را با نام tutorial.myExample1.myPrint1 فراخوانی مینماید. چون متد Main() و tutorial درون یک Namespace قرار دارند، دیگر نیازی به استفاده از نام csharp-persian غیر ضروری است.
در انتهای مثال 4-6، یک Namespace دیگر بصورت csharp-persian.tutorial آورده شده است. کلاسهای myExamlpe1 و myExample2 هر دو متعلق به یک Namespace میباشند، هرچند میتواند آنها را مجزا از یکدیگر نوشت در حالیکه متعلق به یک Namespace باشند. درون متد Main()، متد myPrint2 بصورت tutorial.myExample2.myPrint2 فراخوانی شده است. هرچند کلاس myExample2 خارج از محدودهایست که متد myPrint2 فراخوانی شده است، نیازی به آمردن نام csharp-persian برای این فراخوانی وجود ندارد، زیرا هر دو کلاس متعلق به یک Namespace، یعنی csharp-persian هستند.
توجه نمایید که برای هر یک از کلاسهای myExample1 و myExample2 نامهای متفاوتی انتخاب شده است، زیرا هر عضو متعلق به یک Namespace باید دارای نام یکتایی باشد. برای متدهای myPrint1 و myPrint2 ، بعلت سادگی در امر یادگیری این مطلب، نامهای متفاوتی در نظر گرفته شده است. توجه نمایید که این دو متد بعلت اینکه در کلاسهای متفاوتی قرار دارند، میتوان نامهای یکسانی برایشان انتخاب نمود، و در اینصورت هیچگونه تداخلی بین ایندو ایجاد نخواهد شد.
استفاده از هدایتگر using
// Namespace اعلان
using System;
using csharp_station.tutorial;
// کلاس آغازین برنامه
class UsingDirective
{
// آغاز اجرای برنامه
public static void Main()
{
// Namespace فراخوانی عضوی از
myExample.myPrint();
}
}
// C# PersianTutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("Example of using a using directive.");
}
}
}
در صورتیکه می خواهید متدهایی را بدون استفاده از نام کامل آنها،به همراه نام Namespace، استفاده نمایید، میتوانید از هدایتگر using استفاده نمایید. در مثال 5-6، دوبار از هدایتگر using استفاده شده است. اولین استفاده از این هدایتگر، using System، دقیقاً مشابه به همان چیزی است کع تا کنون در این درسها مشاهده نمودهاید. با استفاده از این هدایتگر میتوانید از اعضای موجود در System، بدون اینکه نیاز به تایپ کلمه System در هربار داشته باشید، استفاده نمایید. در myPrint()، کلاس Console عضوی از System است که دارای متد WriteLine() میباشد. اگر در ابتدای برنامه از هدایتگر using استفاده نکنیم، باید برای هر دفعه استفاده از متد WriteLine()، نام کامل آن یعنی System.Console.WriteLine() را تایپ نماییم.
به طور مشابه، استفاده از using csharp-persian.tutorial امکان استفاده از اعضای این Namespace را، بدون نیاز به تایپ نام کامل آنها فراهم مینماید. چون در ابتدای برنامه از هدایتگر using استفاده نمودهایم، در متن برنامه متد myPrint() را بصورت myExample.myPrint() استفاده نمودهایم، درصورتیکه از هدایتگر using استفاده نمیگردیم برای استفاده از این متد باید آنرا بصورت csharp-persian.tutorial.myExample.myPrint() میآوردیم.
استفاده از هدایتگر Alias
// Namespace اعلان
using System;
using csTut = csharp-persian.tutorial.myExample; // alias
// کلاس آغازین برنامه
class AliasDirective
{
// آغاز اجرای برنامه
public static void Main()
{
// Namespace فراخوانی عضوی از
csTut.myPrint();
myPrint();
}
// متدی که ممکن است تولید ابهام نماید.
static void myPrint()
{
Console.WriteLine("Not a member of csharp-persian.tutorial.myExample.");
}
}
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("This is a member of csharp-persian.tutorial.myExample.");
}
}
}
در برخی موارد ممکن است با Namespace خاصی روبرو شوید که دارای نامی طولانی است و تمایل داشته باشید تا نام آنرا کوتاهتر نمایید. این کار با استفاده از ایجاد استعاره (Alias) امکانپذیر است. همانطور که در مثال 6-6 ملاحظه مینمایید، با استفاده از
csTut = csharp-persian.tutorial.myExample یک استعاره تولید کردهایم و در متن برنامه به جای استفاده از نام طولانی csharp-persian.tutorial.myExample از نام مستعار آن یعنی csTut استفاده نمودهایم. حال از این نام مستعار در هر جای برنامه میتوان استفاده کرد. ما در این برنامه در متد Main() استفاده نمودهایم.
همچنین در متد Main()، فراخوانی از متد myPrint() مربوط به کلاس AliasDirective صورت گرفته است. نام این متد همانند myPrint() موجود در myExample است. علت اینکه میتوان هر دو این متدها را همزمان فراخوانی کرد، استفاده از هدایتگر alias برای متد myPrint() مربوط به کلاس myExample است. (csTut.myPrint()) استفاده از این روش باعث میشود تا کامپایلر دریابد که کدام متد را باید اجرا نماید. در صورتیکه به اشتباه از هدایتگر alias (csTut.myPrint()) استفاده نکنیم، کامپایلر به اشتباه متد myPrint() مربوط به کلاس AliasDirective را دوبار اجرا خواهد کرد.
تا اینجا،ما تنها کلاسها را در Namespace ها نشان دادیم. Namespace ها انواع دیگری را نیز میتوانند در خود داشته باشند که در زیر مشاهده مینمایید :
Classes
Structures
Interfaces
Enumerations
Delegates
خلاصه
در این درس با Namespace آشنا شدید و فراگرفتید که چگونه Namespace خود را اعلان نمایید. اگر نخواهید در هربار استفاده از متدها یا اعضای یک Namespace، نام کامل آنها را استفاده کنید، باید از هدایتگر using استفاده نمایید. در صورتیکه بخواهید بجای استفاده از نام طولانی یک Namespace، از نامی ک.وتاهتر استفاده کنید، باید از هدایتگر استعارهای (Alias Directive) استفاده نمایید