C# - Namespace
Namespace (Ad alanı) aslında bir tür grubu, gruplamanın bir yoludur diyebiliriz. Visual Studio' da bir proje oluşturduğunuzda varsayılan bir ad alanı da oluşturur.
using System;
namespace ProjeCalisma
{
class Program
{
static void Main(string[] args)
{
}
}
}
Bu durumda, "ProjeCalisma" ad alanı artık uygulamanın bir parçasıdır. Kullanacağınız class (sınıf) adların önüne bu ad alanı adını vermeniz gerekir.
Aşağıdaki örneği inceleyelim..
System.IO.File.ReadAllText("test.txt");
"System.IO" namespace imiz içindeki "File" sınıfında bulunan "ReadAllText()" fonksiyonunu bu şekilde kullanıyoruz. Bir ad alanından her sınıf da kullanmak istediğinizde böyle uzun bir ad yazmak pekte pratik değil. Bu yüzden C#, "using" anahtar kelimesini kullanarak tüm bir ad alanı ile ilgili özellikleri dosyada kullanmamızı sağlar. C#'da ilgili kodun geçtiği dosyanın en üstünde bunları görebilirsiniz. Yukarıdaki örnekte "File" sınıfına bir kereden fazla ihtiyaç duyduğumuzda "using System.IO" anahtarı kelimesini yukarı yazıp kullanmak faydalı olacaktır.
Aşağıda bunun örneği verilmiştir..
using System;
using System.IO;
namespace ProjeCalisma
{
class Program
{
static void Main(string[] args)
{
File.ReadAllText("test.txt");
}
}
}
Peki Ad Alanları Gerçekten Önemli mi?
Programlamaya yeni başladıysanız, ad alanlarına neden bu kadar ihtiyacımız olduğunu düşünebilirsiniz. Neden tüm sınıfları her zaman erişilebilir olacak şekilde aynı namespace e koymuyoruz? Bunun sebebi projeniz büyüdükçe yani daha fazla sınıf ve namespace ile çalışmaya başladıkça onları ayırmak kodların bulunması açısından çok önemlidir. Şunu unutmayın ki .Net framework ün kendiside bir projedir ve bu projede birçok sınıf yaratılmıştır (dosya işlemleri, network işlemleri, http işlemleri, matematik işlemleri...vs). Bu kadar çok sınıfın tek bir çatı altında toplanması karmaşıklıktan başka bir şey getirmez. Bu yüzden gruplanması en mantıklı yoldur.
Ad Alanlarının Çakışması
Bazen projelerde aynı isimde olan namespace ler ve class lar yaratılmış olabilir. Hatta bunlar .Net framework ündeki namespace ler ve class lar ile aynı isimde de olabilir.
Aşağıda buna benzer bir örnek yaratalım..
using System;
namespace ProjeCalisma.IO
{
static class File
{
public static void Fonksiyon1()
{
}
}
}
Şimdi projenizde 2 adet "File" class ı kullanılabilir durumda. Hem .Net frameworkunda olan hem de sizin yarattığınız. Bu durumda aşağıdaki şekilde belirtmek en doğrudur.
using System;
using ProjeCalisma.IO;
namespace ProjeCalisma
{
class Program
{
static void Main(string[] args)
{
File.Fonksiyon1();
}
}
}
Ancak projemizde kendi "File" class ımız ile birlikte "System.IO" namespace indeki yani .Net Framework ünün kendi "File" class ını da kullanmak istersek ne olacaktır.
İki class a ait namespace leri "using" ile en yukarı yazsakta derleyici "File" yazdığımızda hangisine ait olanı kullanmak istediğimizi bilemeyecektir. Bu tip durumlarda namespace i using bölümüne değilde class ile birlikte yazarız.
using System;
using System.IO;
namespace ProjeCalisma
{
class Program
{
static void Main(string[] args)
{
ProjeCalisma.IO.File.Fonksiyon1();
System.IO.File.ReadAllText("test.txt");
}
}
}
Takma Ad (Alias) Kullanma
Bezen isimler çok uzun olduğunda bunları her seferinde uzun uzun yazmak yerine namespace adını alias (takma ad) ile kısaltabiliriz.
Aşağıdaki alias örneğini inceleyelim..
using System;
using System.IO;
using PIO = ProjeCalisma.IO;
namespace ProjeCalisma
{
class Program
{
static void Main(string[] args)
{
File.ReadAllText("test.txt");
PIO.File.Fonksiyon1();
}
}
}
3. satırda "ProjeCalisma.IO" artık "PIO" takma adını almış ve bundan sonra ana programda bu isimle çağırılmıştır.
Büyük projelerde gerçekten işe yarayan bir metoddur. Bu projelerde birçok isimin iç içe geçtiği durumlar olabilir. Alias ile karmaşıklığın önüne geçer ve daha kolay anlaşılabilir ve yönetilebilir kod yazmış oluruz.