آشنایی با Namespace و نحوه کار با آنها

آشنایی با Namespace و نحوه کار با آنها

اهداف اين درس به شرح زير مي‌باشد :
 
آشنايي با Namespace در زبان C#
 
چگونگي استفاده از هدايتگر using (using directive) 
 چگونگي استفاده از هدايتگر  alias (alias directive)
 
اعضاي يك Namespace چه هستند؟
------------------------------------------------------------------------------------------------------------------
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) استفاده نماييد.