آموزش فضاهای نام در سی شارپ به زبان ساده
در یکی از اولین مقاله های آموزش سی شارپ، به طور مختصر فضاهای نام (namespaces) را مطرح کردیم. شما به احتمال زیاد کلید واژه را تشخیص می دهید؛ زیرا در بسیاری از فایل هایی که حاوی کدهای سی شارپ هستند؛ به ویژه در بخش ابتدایی، یافت می شوند. یک فضای نام ضرورتاً روشی برای گروه بندی مجموعه ای از آیتم ها، برای مثال، کلاس ها در یک فضای نام گذاری شده ی خود آن می باشد. زمانی که ویژوال استودیو یک پروژه جدید برای شما ایجاد می کند؛ در واقع یک فضای نام پیش فرض نیز ایجاد می کند که در آن اولین فایل شما را قرار می دهد. (این موضوع حداقل برای نوع پروژه اپلیکیشن کنسول صدق می کند).
به مثال زیر توجه کنید:
using System;
namespace MyProject
{
class Program
{
static void Main(string[] args)
{
// More code below this….
در این مورد؛ فضای نام “Myproject” می باشد که اکنون بخشی از برنامه است و هنگام استفاده از کلاس های آن در خارج از آن؛ شما باید نام کلاس را به صورت پیشوند با نام فضای نام آن همراه کنید. هنگامی که می خواهید از چیزی استفاده کنید که عمیقاً در چارچوب دات نت می گنجد؛ همین کد را دقیقاً مانند زیر مشاهده خواهید کرد:
System.IO.File.ReadAllText(“test.txt”);
در این مورد؛ ما از متد ()ReadAlltext استفاده می کنیم که در File class (کلاس فایل) در فضای نام System.IO وجود دارد.. البته نوشتن این نام طولانی هر بار که می خواهید از کلاسی از این فضای نام استفاده کنید؛ ممکن است خسته کننده به نظر بیاید؛ بنابراین سی شارپ به شما اجازه می دهد که یک فضای نام کامل را در دامنه فایل خودتان با به کار گرفتن عبارت using وارد نمایید (import کنید). باز هم ، ممکن است آنها را از قبل بشناسید، زیرا معمولاً می توانید آنها را در بخش بالایی فایل های سی شارپ پیدا کنید. برای مثال بالا ، اگر ما بیش از یکبار به کلاس File احتیاج داشته باشیم ، وارد کردن فضای نام System.IO با به کارگیری عبارت using مانند زیر؛ معنا خواهد داشت:
using System;
using System.IO;
// More using statements here…
چرا به فضاهای نام احتیاج خواهید داشت؟
اگر به تازگی برنامه نویسی را شروع کرده اید، ممکن است بپرسید که چرا ما به فضاهای نام نیاز داریم. چرا تمام کلاس های خود را در یک فضای نام مشابه قرار ندهیم تا همیشه در دسترس باشند؟ شما یک نکته معتبر دارید، اما فقط درصورتی که پروژه تان بسیار کوچک باشد. به محض اینکه شروع به افزودن کلاسهای بیشتر و بیشتر بکنید، جداسازی آنها به فضاهای نام متفاوت؛ ایده ی بسیار بهتری خواهد بود. به این ترتیب می توانید خیلی ساده تر کد مورد نظرتان را پیدا بکنید؛ بخصوص اگر فایل های خود را در پوشه های مربوط به خودشان قرار بدهید – در واقع؛ اگر یک فولدر به پروژه خود اضافه کنید و سپس یک کلاس به آن بیفزایید؛ ویژوال استودیو به صورت اتوماتیک آن را در فضای نام مربوطه قرار می دهد. بنابراین؛ اگر یک فولدر در MyProject ایجاد کنید که MyFolder نام دارد؛ کلاس های اضافه شده به آن؛ به صورت پیش فرض؛ در فضای نامی قرار می گیرند که MyProject.MyFolder نام دارد.
یک مثال عالی از این که چرا فضای نام مورد نیاز می باشد، خود چارچوب دات نت است. فرض کنید که تمام کلاس های موجود در چارچوب در یک فضای نام جهانی قرار داشتند، در این صورت آشفتگی و سردرگمی زیادی ایجاد می شد. در عوض، آنها به خوبی سازماندهی شده اند؛ به صورتی که System به عنوان فضای نام اصلی برای بیشتر کلاس ها می باشد و سپس فضاهای نام فرعی مانند System.IO برای آیتم های ورودی/خروجی به کار می رود؛ System.Net برای آیتم های مربوط به شبکه می باشد و System.Net.Mail برای آیتم های مرتبط با ایمیل به کار می رود.
نام های مربوط به فضاهای نام
همان طور که ذکر کردیم؛ فضاهای نام برای آن که آیتم های شما را گروه بندی کنند نیز به کار می روند؛ بنابراین؛ آنها در دامنه مخصوص به خودشان نیز می توانند وجود داشته باشند. این امر همچنین به آن معناست که شما می توانید آزادانه کلاس هایی با نام مشابه ایجاد کنید؛ همان طور که موارد دیگری در پروژه شما یا حتی در چارچوب دات نت نیز یافت می شوند. برای مثال، شما ممکن است بخواهید که کلاس File (فایل) خودتان را داشته باشید. همان طور که می توانید در مثال قبلی مشاهده کنید؛ با وجود این که کلاسی که در فضای نام System.IO وجود دارد؛ شما آزادید که یک کلاس در فضای نام خودتان ایجاد کنید. مثال زیر را مشاهده کنید:
using System;
برنامه نویسی سی شارپ رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن، توسعه وب ... دانلود:
namespace MyProject.IO
{
class File
{
public static void HelloWorld()
{
Console.WriteLine(“Hello, world!”);
}
}
}
اکنون زمانی که می خواهید از آن کلاس در پروژه تان؛ مثلاً متد Program.cs Main استفاده کنید؛ (اگر مثل من؛ بر روی یک برنامه کنسول کار می کنید) می توانید نام کامل را مشابه زیر بنویسید:
MyProject.IO.File.HelloWorld();
همان طور که به لطف استفاده از عبارت using می توانید با هر فضای نام دیگر (چه فضای نام داخلی یا آنهایی که توسط کاربر تعریف شده اند) کار کنید؛ شما همچنین می توانید فضای نام خودتان را نیز وارد کنید. در ادامه مثال کامل تری برای تان آورده ایم:
using System;
using MyProject.IO;namespace MyProject
{
class Program
{
static void Main(string[] args)
{
File.HelloWorld();
}
}
}
تا این جا بدون مشکل جلو آمدیم. با این حال، اگر بخواهید کلاس File از فضای نام System.IO را مورد استفاده قرار بدهید؛ چه می شود؟ خوب، این جایی است که مشکل شروع می شود، زیرا اگر آن فضای نام را نیز با استفاده از یک عبارت using وارد کنید، کامپایلر دیگر نمی داند که به کدام کلاس File اشاره می کنید -به کلاس فایل خود مان یا یکی از فضاهای نام System.IO. با وارد کردن یکی از فضاهای نام (در حالت ایده آل آنکه بیشترین انواع را از آن استفاده می کنید) این مشکل حل می شود و سپس مانند مثال زیر، نام دیگری تعیین می شود:
using System;
using System.IO;namespace MyProject
{
class Program
{
static void Main(string[] args)
{
MyProject.IO.File.HelloWorld();
}
}
}
اما این که بخواهید هر دفعه تایپ را انجام دهید؛ ممکن است برای تان دشوار باشد؛ به ویژه اگر کلاس شما به صورتی عمیق تر و تو در تو در فضاهای نام؛ قرار داشته باشد؛ مثلاً به صورت MyProject.FileStuff.IO.File باشد. خوشبختانه سی شارپ برای این مشکل نیز راه حلی دارد.
استفاده از دستور العمل نام جایگزین
برای کوتاه تر کردن اسم فضاهای نام؛ می توانید فضای نام را تحت یک اسم متفاوت وارد کنید؛ برای این منظور از دستور نام جایگزین استفاده کنید. توجه کنیدکه چگونه در این مثال این کار را انجام داده ایم:
using System;
using System.IO;
using MyIO = MyProject.IO;namespace MyProject
{
class Program
{
static void Main(string[] args)
{
File.ReadAllText(“test.txt”);
MyIO.File.HelloWorld();
}
}
}
جادوی اصلی در خط سوم اتفاق می افتد؛که در آن ما فضای نام MyProject.IO را برداشته و به آن یک نام کوتاه تر می دهیم (MyIO)، که سپس هنگامی که می خواهیم به آیتم های آن دسترسی پیدا کنیم؛ می توانیم از آن استفاده کنیم. در این مثال شاید خیلی در تایپ کردن، زمان صرفه جویی نکنیم؛ اما خوب است بدانید که نام ها ممکن است طولانی تر از اینها و تودرتو بشود.
خلاصه
فضاهای نام به شما این فرصت را می دهد که آیتم های خود را در ” فضاهای نام” گروه بندی کنید؛ که باعث می شود کد نویسی تان ساختار بهتری داشته باشد و بتوانید چندین کلاس با نام مشابه داشته باشید؛ در حالی که آنها در فضاهای نام جداگانه ای قرار گرفته اند.