Merhaba,
Önceki yazılarımda genel bilgilerden oyun projesine kadar ilerledik. Şimdi ise C#'da kullanılan mimariden bahsedeceğiz.
Öncelikle kısa bir hatırlatma yapalım. C#'da bir yapının başlangıcı ve bitişi iki süslü parantez ile belirtilmektedir. Örnek olarak bir fonksiyonu düşünelim:
int topla(int a, int b)
{
return a + b;
}
Yukarıdaki örnek kodda görüldüğü üzere, "topla" fonksiyonunun başlangıcı ve bitişi iki süslü parantez ile gösterilmektedir ({...}). namespace tanımlarının sınırlarını da aynı şekilde süslü parantezler ile çizeceğiz.
namespace tanımları, tabiri caizse yazdığınız kodları adreslemek için kullanacağınız yapılardır. Bir yazılımı geliştirmeniz sırasında sadece kendi yazdığınız "class"ları ve fonksiyonları kullanmazsınız. Yardımcı birçok yazılımın ve .Net Framework'ün içindeki class nesnelerini de kullanırsınız. Bu dış yazılımlar içindeki class nesnelerinden herhangi biri ile, kendi yazdığınız class nesnelerinin isimlerinin aynı olması durumunda ise adreslemede sorun (conflict / çatışma) yaşarsınız. Bu durumda yazdığınız kod derlenmez. Benzer bir şekilde, farklı işleri yapıyor olmasına rağmen isimlerinin aynı olması gereken class nesnelerine kendi yazdığınız kodlar içinde de ihtiyaç duyabilirsiniz.
namespace tanımları sayesinde, diğer kütüphanelerle çatışabilecek isimleri oluşturmuş olduğunuz namespace içinde tutarsınız. Bir örnekle devam edelim.
namespace ornek1
{
class ornekClass
{
public static int ornek()
{
return 0;
}
}
}
Yukarıda "ornek1" adında bir namespace tanımladık. Bu namespace bizim yazılımımıza özel ve içindeki sınıf tanımlarına ulaşmak için öncelikle namespace'in (yine tabiri caizse) kapısından geçilmesi gerekiyor. namespace içindeki "ornek" adındaki fonksiyonu, ornek1 namespace tanımının dışında bir konumdan çağırmak için aşağıdaki gibi bir adresleme kullanmamız gerekir:
ornek1.ornekClass.ornek();
Dikkat ederseniz fonksiyona giden adresi tüm ayrıntılarıyla veriyoruz. Önce namespace, sonra class sonra da fonksiyon adresleri belirtilerek fonksiyona ulaşılıyor. Dıştan içe doğru bir sıralama bulunmakta.
namespace tanımları sayesinde, kodlarınızı kullanışlı bir şekilde organize edebilirsiniz. Dolayısıyla namespace kullanımının 2 önemli amacı bulunmaktadır. Bunlar yönetilebilir kod yazmak ve isim çatışmalarının önüne geçmektir.
using Belirteci
Örnek projelerimizde, Visual Studio tarafından üretilmiş olan kodları incelediyseniz formların içinde bulunduğu dosyaların ilk satırlarında "using System;" gibi deyimler görmüşsünüzdür.
Yukarıda bahsetmiş olduğumuz gibi, bir namespace içindeki bir fonksiyona ulaşmak için o fonksiyonun tam adresini vermelisiniz. "using" deyimi ise, bir namespace'deki sınıflara ve fonksiyonlara namespace'in adını yazmadan ulaşmanızı sağlar.
Örneğimizde "using System;" yazdığımıza göre, "System" adındaki namespace'in içindeki fonksiyonlara ve sınıflara, başlarındaki namespace adresini yazmadan ulaşabiliriz demektir.
Örnek:
using ornek1;
namespace ornek1
{
class ornekClass
{
public static int main()
{
return 0;
}
}
}
using ornek1;
namespace ornek1
{
class ornekClass
{
public static int main()
{
return 0;
}
}
}
class ornekClass2
{
int main2()
{
return ornekClass.main();
}
}
{
int main2()
{
return ornekClass.main();
}
}
"using" deyimi kullanılmayan örnek:
namespace ornek1
{
class ornekClass
{
public static int main()
{
return 0;
}
}
}
{
class ornekClass
{
public static int main()
{
return 0;
}
}
}
class ornekClass2
{
int main2()
{
return ornek1.ornekClass.main();
}
}
{
int main2()
{
return ornek1.ornekClass.main();
}
}
nested namespace
Bir namespace (Ad alanı şeklinde çevirirsek hatalı olmaz sanıyorum.) içinde başka bir namespace tanımlamak mümkündür. Böylelikle kod hiyerarşisini daha iyi organize etmiş olursunuz.
namespace ornek1
{
namespace ornek2 // Bu bir nested namespace'dir.
{
class ornekClass
{
public static int main()
{
return 0;
}
}
}
}
namespace ornek3
{
class ornekClass2
{
int main2()
{
return ornek1.ornek2.ornekClass.main();
}
}
}
Hiç yorum yok:
Yorum Gönder