
آموزش گام به گام #C (جلسه ششم: Namespaceها)
معمولا توجه خاصی به چند خط ابتدایی کدها(یعنی آنهایی که using) دارند نمیکنیم. واقعا آنها چه هستند؟ تا حالا فکر کدید؟ در این جلسه به صورت مفصل و دقیق namespaceها و موضوعات مرتبط با آنها را توضیح خواهیم داد. با ما همراه باشید.
جلسه اول: آغاز کار با #C | جلسه ششم: namespaceها | جلسه یازدهم: اندیس گذار یا indexerها | جلسه شانزدهم: استفاده از اتریبیوتها | جلسه بیست و یکم: متدهای بینام یا anonymous |
جلسه دوم: عملگرها، نوعها و متغیرها | جلسه هفتم: مقدمهای بر کلاسهای #C | جلسه دوازدهم: ساختار یا structها | جلسه هفدهم: enumها | جلسه بیست و دوم: موضوعاتی در مورد نوع در #C |
جلسه سوم: عبارات کنترلی - گزینشی | جلسه هشتم: وراثت کلاس در #C | جلسه سیزدهم: واسط یا interfaceها | جلسه هجدهم: عملگرهای overloading | جلسه بیست و سوم: کار با نوعهای nullable |
جلسه چهارم: عبارات کنترلی - حلقهها | جلسه نهم: چند ریختی | جلسه چهاردهم: مقدمهای بر delegateها و رویدادها | جلسه نوزدهم: کپسولهسازی | |
جلسه پنجم: متدها | جلسه دهم: ویژگی یا propertyها | جلسه پانزدهم: مقدمهای بر کنترل خطا یا exception | جلسه بیستم: مقدمهای بر generic collectionها |
در این جلسه، شما را با Namespaceهای #C آشنا میکنیم. اهداف ما در این جلسه به شرح زیر هستند:
- درک اینکه Namespace چیست.
- آموزش استفاده از دستورusing.
- آموزش استفاده از دستور alias.
- درک اینکه اجزای namespace چه هستند.
در جلسه اول، با using System آشنا شدید. دستوری که در برنامه SimpleHello به کار بردیم. این دستور به شما اجازه داد از اجزای Systemnamespace استفاده کنید. به خاطر تمرکز بسیار محدود آن جلسه، مجبور شدیم توضیح در مورد namespaceها را تا الان به تعویق بیندازیم.
وقتی این جلسه را به پایان برسانید، کاملا با دستور using و مباحث دیگر در این زمینه آشنا خواهید شد.
Namespaceها عناصر برنامه #C هستند که طراحی شدهاند تا در سازماندهی برنامههایتان به شما کمک کنند. آنها همچنین به پرهیز از تصادم نامها بین دو مجموعه کد نیز کمک میکنند. استفاده از namespaceها در کد یک عادت خوب است چون شما را از مشکلاتی که بعدا در زمان استفاده مجدد از برخی قطعه کدهایتان به وجود میآیند، نجات میدهد.
برای مثال، اگر کلاسی به نام Console ایجاد کنید، برای اطمینان از اینکه در برنامه هیچگونه گیجی و شکی در مورد زمان استفاده از کلاس System.Console یا زمان استفاده از کلاس شما(که نام آن Console) است پیش نیاید، پس باید کلاسی که ایجاد کردید را درون namespaceکد خودتان قرار دهید.
در کل، ایجاد کلاسی به نام Console فکر بدی است، اما در بسیاری از موارد، کلاسهای شما نامهای مشابه اسامی کلاسهای موجود در کتابخانه کلاس .NET Framework یا یک کتابخانه دیگر خواهند داشت و namespaceها به شما کمک میکنند تا از مشکلات یکسان بودن نام کلاسها نجات پیدا کنید.
Namespaceها ربطی نام فایلها یا دستورها ندارند. اما اگر نام گذاری دستورها و فایلها مشابه namespaceها به شما در سازماندهی کدهایتان کمک میکنید، میتوانید این کار را انجام دهید، ولی اجباری نیست.
لیست ۱-۶. استفاده از namespace در سی شارپ : NamespaceCSS.cs
// Namespace تعریف
using System;
// C# MUG تمرینی Namespace
namespace csharp_station
{
// کلاس آغاز برنامه
class NamespaceCSS
{
//اجرای برنامه را آغاز میکند Main تابع.
public static void Main()
{
// نوشتن در کنسول
Console.WriteLine("This is the new C# Station Namespace.");
}
}
}
لیست ۱-۶ چگونگی ایجاد یک namespace را نشان میدهد. ما namespace جدید را با قرار دادن کلیدواژه namespace در قبل از csharp_mug تعریف کردیم. آکولادها، اعضای درون namespace را احاطه میکنند.
لیست ۲-۶. Namespace تو در تو ۱: NestedNamespace1.cs
// Namespace تعریف
using System;
// C# MUG تمرینیNamespace
namespace csharp_station
{
namespace tutorial
{
// کلاس آغاز برنامه
class NamespaceCSS
{
//اجرای برنامه را آغاز میکند Main تابع
public static void Main()
{
// نوشتن در کنسول
Console.WriteLine("This is the new C# Station Tutorial Namespace.");
}
}
}
}
Namespaceها به شما اجازه میدهند تا سیستمی برای سازماندهی کدهای خود ایجاد کنید. یک روش خوب برای سازماندهی namespaceها از طریق سیستم سلسله مراتبی است. در این سیستم، نامهای کلیتر را در بالای سلسله مراتب قرار میدهید و هر چه به پایین میآیید دقیقتر میشوید.
سیستم سلسله مراتبی را میتوان با namespaceهای تو در تو نمایش داد. لیست ۲-۶ چگونگی ایجاد یک namespace تو در تو را نشان میدهد. با قرار دادن کد در namespaceهای فرعی مختلف، میتوانید کد خود را سازماندهی کنید.
لیست ۳-۶. Namespace تو در تو ۲: NestedNamespace2.cs
// Namespace تعریف
using System;
// C# MUG تمرینیNamespace
namespace csharp_station.tutorial
{
// کلاس آغاز برنامه
class NamespaceCSS
{
//اجرای برنامه را آغاز میکند Main تابع
public static void Main()
{
// نوشتن در کنسول
Console.WriteLine("This is the new C# Station Tutorial Namespace.");
}
}
}
لیست ۳-۶ روش دیگری برای نوشتن namespaceها نمایش میدهد. این مجموعه کد، namespace تو در تو را با قرار دادن عملگر نقطه بین csharp_mug و tutorial مشخص میکند. نتیجه دقیقا مشابه لیست ۲-۶ است. به هر حال، نوشتن لیست ۳-۶ آسانتر است.
لیست ۴-۶. فراخوانی اعضای namespaceها: NamespaceCall.cs
// Namespace تعریف
using System;
namespace csharp_station
{
// تو در تو namespace
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine("First Example of calling another namespace member.");
}
}
}
// کلاس آغاز برنامه
class NamespaceCalling
{
//اجرای برنامه را آغاز میکند Main تابع
public static void Main()
{
// نوشتن در کنسول
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}
// بالا namespace مشابه با namespace
namespace csharp_station.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine("Second Example of calling another namespace member.");
}
}
}
لیست ۴-۶ مثالی از چگونگی فراخوانی اعضای namespace با نامهای کامل را نشان میدهد. یک نام کامل، شامل عناصر زبان است(از نام namespace گرفته تا فراخوانی متد).
در بالای لیست، یک namespace تو در تو به نام tutorial درون namespace به نام csharp_mug همراه با کلاس myExample1 و متد myPrint1 وجود دارد. ()Mainاین متد را با نام کامل ()tutorial.myExample1.myPrint فراخوانی میکند.
چون ()Main و tutorial namespace در یک namespace مشابه قرار دارند، پس استفاده از csharp-mug به شکل نام کامل غیر ضروری است.
در آخر لیست ۴-۶ چیزی به csharp_mug.tutorial namespace اضافه شده است. کلاسهای myExample1 و myExample2 هر دو به یک namespace تعلق دارند. علاوه بر این، میتوان آنها را در فایلهای جدا نوشت، ولی در عین حال متعلق به یک namespace یکسان باشند.
در ()Main، متد ()myPrint2 با نام کامل ()tutorial.myExample2 فراخوانی شده است، لازم نیست که namespace csharp_mug به عنوان بخشی از نام کامل بیان شود. این امر به این خاطر است که هر دو کلاسها به یک namespace تعلق دارند، یعنی به csharp_mug.
توجه کنید که من از اسامی متفاوت برای دو کلاس myExample1 و myExample2 استفاده کردم. این کار ضروری بود، چون هر عضو namespace از یک نوع، باید نام منحصر به فردی داشته باشند.
به یاد داشته باشید، آنها هر دو در یک namespace قرار دارند و شما نباید با به کار بردن نام مشابه در مورد اینکه کدام کلاس باید اجرا شود، ابهام ایجاد کنید. متدهای ()myPrint1 و ()myPrint2 دارای اسامی متفاوت هستند، فقط به این دلیل که باعث میشوند ارائه مثال راحتتر باشد.
میتوانستیم برای هر دو یک نام یکسان انتخاب کنیم و هیچ مشکلی هم پیش نیاید، چون کلاسهای آنها فرق میکندد، بنابراین همیشه سعی کنید از ایجاد ابهام پرهیز کنید.
لیست ۵-۶. دستور using: UsingDirective.cs
// Namespace تعریف
using System;
using csharp_station.tutorial;
// کلاس آغاز برنامه
class UsingDirective
{
//اجرای برنامه را آغاز میکند Main تابع
public static void Main()
{
// namespace فراخوانی عضو
myExample.myPrint();
}
}
// C# MUG تمرینی Namespace
namespace csharp_station.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("Example of using a using directive.");
}
}
}
اگر میخواهید متدها را بدون تایپ کردن نام کامل آنها فراخوانی کنید، میتوانید از دستور using استفاده کنید. در لیست ۵-۶، ما دو دستور using را نشان دادیم. اولین، using System، همان دستور usingی است که در تمام برنامههای این جلسه و جلسات قبل مشاهده کردید.
این دستور به شما اجازه میدهد نام متدهای اعضای System namespace را بدون نیاز به اینکه هر دفعه کلمه System را اضافه کنید، تایپ کنید. در ()myPrint، کنسول یک عضو کلاس از System namespace با متد ()WriteLine است. نام کامل آن (…)System.Console.WriteLine است.
به طور مشابه، دستور using و دستور using csharp_mug.tutorial به ما اجازه میدهند تا اعضای csharp_mug.tutorial namespace را بدون تایپ کردن نام کامل فراخوانی کنیم. به همین دلیل میتوانیم بنویسیم ()myExample.myPrint.
اگر از دستور using استفاده نمیکردیم، هر دفعه که میخواستیم آن متد را فراخوانی کنیم، مجبور بودیم بنویسیم ()csharp_mug.tutorial.myExample.myPrint.
لیست ۶-۶. دستور Alias: AliasDirective.cs
// Namespace تعریف
using System;
using csTut = csharp_station.tutorial.myExample; // alias
// کلاس آغاز برنامه
class AliasDirective
{
//اجرای برنامه را آغاز میکند Main متد
public static void Main()
{
// namespace فراخوانی عضو
csTut.myPrint();
myPrint();
}
// متدی با احتمال مبهم بودن
static void myPrint()
{
Console.WriteLine("Not a member of csharp_station.tutorial.myExample.");
}
}
// C# MUG تمرینی Namespace
namespace csharp_station.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("This is a member of csharp_station.tutorial.myExample.");
}
}
}
گاهی ممکن است با namespaceهای طولانیای رو به رو شوید و با خودتان بگویید که ای کاش میشد آنها را کوتاهتر نوشت. این کار باعث افزایش خوانایی شده و در عین حال از تصادم نام با متدهای دارای نام مشترک نیز جلوگیری میکند.
لیست ۶-۶ چگونگی ایجاد یک alias با استفاده از دستور using csTut = csharp_mug.tutorial.myExample را نشان میدهد. حالا میتوانید از نام csTut در همه جا استفاده کنید، در این فایل، به جای عبارت طولانی csharp_mug.tutorial.myExample و غیره. ما این دستور را در متد ()Main به کار بردیم.
همچنین در ()Main یک فراخوان برای متد ()myPrint از کلاس AliasDirective وجود دارد. این نام دقیقا مشابه نام متد ()myPrint در کلاس myExample است.
دلیل اینکه هر دوی این متدها میتوانند با یک فراخوان متد مشترک فراخوانی شوند این است که متد ()myPrint در کلاس myExample با نام مستعار یا alias به نام csTut به صورت کامل بیان شده است.
این به کامپایلر میگوید که دقیقا کدام متد باید اجرا شود. اگر به اشتباه csTut را از فراخوان متد حذف کنیم، آنگاه کامپایلر متد ()myPrint از کلاس AliasDirective را دو بار اجرا میکند.
تا اینجا، تنها چیزی که در namespaceهای خود نشان دادیم کلاسها بودند. به هر حال، namespaceها میتوانند نوعهای زیر را نیز در خود نگه دارند:
- کلاسها
- Structureها
- واسط یا Interface ها
- Enumerationها
- اختصاص یا delegationها
در جلسات بعدی مفصل در مورد این نوعها صحبت خواهیم کرد.
خلاصه
حالا دیگر میدانید namespace چیست و میتوانید namespaceهای مخصوص خودتان را تعریف کنید. اگر نمیخواهید یک نام کامل را تایپ کنید، میدانید که چطور باید برای این منظور از دستور using کمک بگیرید. وقتی میخواهید یک namespace طولانی را کوتاه و مختصر کنید، میتوانید از دستور alias استفاده کنید.
همچنین، علاوه بر کلاس، با برخی دیگر از نوعهایی که میتوانند در namespaceها قرار گیرند نیز آشنا شدید.
منبع: c#_station
جلسه بعد جلسه قبل
آخرین مطالب

دستور UPDATE در SQL Server برای تغییر دادههای موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفادهای ندارد را حذف کنید. برای ...

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...
دیدگاه خود را درباره این پست بنویسید