از فضاهای نام و یا همان Namespace ها برای سازماندهی کلاس ها استفاده میشود. از آنها همچنین برای کوتاه کردن کد نویسی استفاده میشود. در این فصل با این امکان کاربردی از زبان سی شارپ آشنا میشویم.
Namespace
فضاهای نام در برنامه های زبان سی شارپ مکرراً استفاده می شوند. زبان سی شارپ از فضاهای نام برای دو هدف استفاده میکند: اولاً زبان سی شارپ از فضاهای نام برای سازماندهی کلاس های خود استفاده می کند و ثانیاً با تعریف فضاهای نام در برنامه می توانیم محدوده یک کلاس و متد های آن را مشخص کنیم. این مورد در پروژههای بزرگ بسیار کاربردی است.
دسترسی به فضاهای نام
اغلب برنامه های سی شارپ با بخش دستورات using
آغاز میشوند. این بخش فضاهای نامی که در طول برنامه مکررا از آنها استفاده میشود را لیست میکند. استفاده از فضاهای نام در ابتدای برنامه در نوشتن کدها صرفهجویی میکند و در این صورت نیاز نیست برای دسترسی به یک متد از نام کامل آن استفاده کرد.
برای مثال با اضافه کردن خط زیر به ابتدای برنامه :
using System;
برنامه نویس می تواند متد ()WriteLine
را به شکل زیر در برنامه فراخوانی کند :
Console.WriteLine("Hello, World!");
این در حالی است که اگر بخواهیم از نام کامل این متد استفاده کنیم باید هر بار متد ()WriteLine
را به شکل زیر فراخوانی کنیم :
System.Console.WriteLine("Hello, World!");
نام های مستعار برای فضاهای نام
میتوان برای فضاهای نام، نام مستعار تعیین کرد. این مورد به خصوص برای زمانی که از فضاهای نام تودرتو استفاده می کنید بسیار مفید است. نمونه مثال زیر از نام Co به عنوان نام مستعار برای یک فضای نام استفاده کرده است :
using Co = Company.Proj.Nested;
نکته : بعد از تعیین نام مستعار میتوان در برنامه با استفاده از عملگر ::
با نام مستعار به آن فضای نام دسترسی داشت.
استفاده از فضاهای نام برای کنترل محدوده
از کلمه کلیدی namespace
برای تعریف یک محدوده استفاده میکنیم. توانایی تعریف یک محدوده در یک پروژه میتواند به سازماندهی کد شما کمک زیادی بکند. در نمونه مثال زیر کلاسی با نام SampleClass
در دو فضای نام متفاوت تعریف شده است.
فضاهای نام یکی در دیگری قرار گرفته اند. در اینجا از عملگر نقطه(.
) برای متمایز کردن متد هایی که میخواهیم از این دو کلاس همنام فراخوانی کنیم استفاده می کنیم :
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
// Create a nested namespace, and define another class.
namespace NestedNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside NestedNamespace");
}
}
}
class Program
{
static void Main(string[] args)
{
// Displays "SampleMethod inside SampleNamespace."
SampleClass outer = new SampleClass();
outer.SampleMethod();
// Displays "SampleMethod inside SampleNamespace."
SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
outer2.SampleMethod();
// Displays "SampleMethod inside NestedNamespace."
NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
inner.SampleMethod();
}
}
}
نامهای کامل برای کلاس ها
هر کلاس و یا فضای نامی که در کلاس و فضای نام دیگری قرار می گیرد، دارای یک نام کامل است که می توان از آن نام برای رجوع به آن استفاده کرد. برای مثال عبارت A.B
اشاره به این دارد که A
نام یک فضای نام بوده و B
کلاس و یا فضای نامی داخل آن است. در نمونه مثال زیر کلاس و فضاهای نامی وجود دارند که داخل کلاس و فضاهای نام دیگری قرار گرفته اند. نام کامل هر عضو به صورت کامل در روبه روی آن نوشته شده است :
namespace N1 // N1
{
class C1 // N1.C1
{
class C2 // N1.C1.C2
{
}
}
namespace N2 // N1.N2
{
class C2 // N1.N2.C2
{
}
}
}
می توان کلاس C۳
را به فضای نام N۱.N۲
که خود عضوی از N۱ است به شکل زیر اضافه کرد :
namespace N1.N2
{
class C3 // N1.N2.C3
{
}
}
استفاده از فضاهای نام Global
توانایی دسترسی به فضاهای نام global
برای زمانی که آنها به هر دلیلی در برنامه مخفی شدهاند (زمانی که متغیری با نامی مشابه با آنها تعریف میکنیم) میتواند مفید باشد. این کار با استفاده از کلمه کلیدی global انجام می شود.
در نمونه مثال زیر با تعریف ثابتی با نام Console
دیگر نمی توان به صورت مستقیم به کلاس Console از فضای نام System
دسترسی داشت :
using System;
class TestApp
{
// Define a new class called 'System' to cause problems.
public class System { }
// Define a constant called 'Console' to cause more problems.
const int Console = 7;
const int number = 66;
static void Main()
{
// The following line causes an error. It accesses TestApp.Console,
// which is a constant.
//Console.WriteLine(number);
}
}
حتی استفاده از نام کامل هم باعث خطا می شود :
// The following line causes an error. It accesses TestApp.System,
// which does not have a Console.WriteLine method.
System.Console.WriteLine(number);
با این حال می توانید از global
برای دسترسی به این کلاس استفاده کنید :
global::System.Console.WriteLine(number);