Merhaba,
Bu içeriğimizde C# 11 ile gelen File Scoped Types özelliğini ve bu özelliğin getirisi olan file
keyword’ünün işlevselliğini irdeliyor olacağız.
File Scoped Types Nedir?
Bir class’ın, interface’in, struct’ın vs. bulunduğu dosyayla kullanımını kısıtlamak için kullanılan yeni bir özelliktir. Bu özelliğin davranışını sergileyebilmesi için C# diline file
keyword’ü eklenmiştir.
File Scoped Types, herhangi bir yapılanmanın erişimiyle ilgili davranış sergilediği ve bu davranış neticesinde erişime kısıtlama getirdiği için esasında yeni bir Access Modifier‘dır.
File Scoped Types özelliği ile aynı namespace veyahut assembly içerisindeki tür adlarının(type names) aralarında olası meydana gelebilecek isimsel çakışmalarını önleyebilmekte ve böylece bir uygulamadaki namespace’ler de aynı isme sahip birden fazla tür tanımlayabilmekteyiz. Özellikle Code Generator süreçlerinde üretilen kodlardaki yapıların birbirleriyle isimsel çakışması durumunda File Scoped Types özelliği kullanılarak bu tarz problemlerin üstesinden gelinebilmektedir.
Şimdi özelliği daha iyi gözlemleyebilmek için aşağıdaki görseli inceleyelim;
Görüldüğü üzere farklı dosyalarda tanımlanmış olan aynı namespace içerisindeki ‘Example’ sınıfları isimsel çakışma yaşadıklarından dolayı hata vermektedirler.
Eğer ki bu sınıfları yandaki gibi file
keyword’ü ile işaretlersek bu hata ortadan kalkacak ve her iki sınıf, her ne kadar aynı namespace içerisinde olsalar dahi farklı dosyalarda olduklarından dolayı aynı isimde tanımlanabilecektirler. Tam bu noktada İyi de hoca! Biz bu işi partial class‘lar ile yapmıyor muyduk? diye söylendiğinizi duyar gibiyim…
Evet, partial class’lar ile bir sınıfı aynı namespace altında fiziksel olarak birden fazla parçaya dağıtabiliyor lakin kullanım sürecinde compiler açısından bir bütün olarak değerlendirerek davranışlarımızı uygulayabiliyoruz. Bunu genellikle code generator gibi otomasyonel sistemlerde; üretilen kodun özel olarak yazdığımız kodları ezmemesi için kullanıyoruz. Partial class’lar özünde tek bir class’a karşılık gelirken, File Scoped Types özelliği ile üretilmiş class’lar ise aynı isimde olsalar bile farklı class’lardır diyebiliriz. Ayrıca File Scoped Types özelliğini code generator sisteminin ürettiği kodun, başka bir code generator tarafından oluşturulan türlerle çakışma ihtimalini törpülemek için düşünebiliriz. İkisinin arasındaki niyetsel fark bundan ibarettir. Söz dizimi olarak ise partial class’ların faaliyet alanları tüm uygulamayken, File Scoped Types’ın ise tanımlandığı dosyadan ibaret olmasıdır. Bu durumu içeriğimizin devamında daha da açıyor olacağız.
Şimdi gelin File Scoped Types özelliğinin incelemesini biraz daha derinleştirelim.
1 2 3 4 5 6 | namespace X; file class MyClass { public string Get() => "File1.cs MyClass" ; } |
Yukarıdaki kod bloğunu incelerseniz ‘File1.cs’ dosyası içerisinde ‘MyClass’ isimli bir class tanımlanmıştır ve malum file
keyword’ü ile işaretlenmiştir. C#’ta bu şekilde tanımlanmış olan bir yapıya erişim gösterebilmek doğrudan mümkün değildir. Yani herhangi bir noktadan new MyClass()
diyerek bu sınıftan nesne üretemeyiz, üretemeyiz çünkü bu sınıfın faaliyet alanı ve erişim sınırı sadece ‘File1.cs’den ibarettir. Bu davranışa file
keyword’ü sebep olmaktadır.
File Scoped Types özelliği sayesinde koddaki yapının faaliyet alanı dosya düzeyinde olacaktır. Yani ilgili kod içerisindeki yapıya yalnız o dosya içerisinden erişilebilecektir.
Bu durumu ilgili dosya içerisinde bulunan özel yapılardan faydalanarak aşabilmekteyiz. Şöyle ki;
01 02 03 04 05 06 07 08 09 10 11 12 | namespace X; file class MyClass { public string Get() => "File1.cs MyClass" ; } public class File1MyClassCreator { public string Create() => new MyClass().Get(); } |
Yukarıdaki koda göz atarsanız eğer ‘File1.cs’ dosyası içerisindeki ‘File1MyClassCreator’ isimli sınıf, file
keyword’ü ile işaretlenmediği için normal bir davranış sergileyecek ve uygulamada erişim belirleyicisinin izin verdiği ölçüde erişilebilir olacaktır. Ayrıca, aynı dosya içerisindeki ‘MyClass’ sınıfına erişim gösterebileceğinden dolayı ilgili sınıf üzerinden herhangi bir işlem gerçekleştirebilecektir. Ama burada dikkat edilmesi gereken husus şudur ki, geriye ‘MyClass’ türünden bir nesne döndürmek istesek bu durumu gerçekleştiremeyeceğiz. Çünkü ‘MyClass’ file
ile işaretli olduğu için erişim sınırının yanında işlevsel sınırı da dosya düzeyinde olacaktır ve bu sınıftan üretilen herhangi bir instance’ın uygulama seviyesinde herhangi bir noktada kullanılabilmesi pratikte mümkün olmayacaktır.
Bu noktada şöyle bir özet verebiliriz ki, file
keyword’ü ile işaretlenmiş olan sınıflara doğrudan bir erişim söz konusu değildir ve bulundukları kaynak dosyasının dışından dolaylı olarak erişilebilirler. İşte bundan dolayı File Scoped Types özelliği kullanılan yapılar public
, private
vs. gibi access modifiers ile işaretlenemezler.Şimdi bu noktaya kadar anlattıklarımızı şöyle aşağıdaki görselde olduğu gibi geniş manada özetleyelim;
File Scoped Types’ı Hangi Yapılarda Kullanabiliriz?
File Scope Types özelliğininin getirisi olan file
keyword’ü aşağıdaki yapılar eşliğinde kullanılabilir.
class | interface | struct |
enum | delegate | record |
Property, event, field, metot vs gibi memberlar için kullanılamaz. |
file partial
Normal şartlarda bir dosyada file
ile işaretlenmiş olan aynı isme sahip tek bir yapı kullanılabilir.
Lakin istendiği taktirde bu yapıları file partial
ile işaretleyerek tek bir dosyada, aynı isme sahip birden fazla yapı oluşturabilir ve bunların hepsini bir bütün olarak kullanabilirsiniz.
Bu Özellik Neden Geldi?
Şimdi gelin son olarak bu özelliğin hangi ihtiyaçlara istinaden geldiğinin istişaresini eyleyip, yazımızı nihayete erdirelim. Bu özelliğin C# diline gelme nedenlerini birkaç maddeyle aşağıdaki gibi kategorize edebiliriz.
- Generated Code
Yazımızın ilk satırlarında da söylediğimiz gibi tipik olarak generate edilen kodlar aynı sınıf isimlerini tekrar tekrar kullanabilme eğilimine sahiptirler. Bu üretilen kodlarda olası isimsel çakışmalarıfile
keyword’ü ile önleyebiliriz. - Nested Class
Nested class’lar da ister istemez sınıfsal isim çakışmaları olabilmektedir. Bu olası durumlarfile
keyword’ü ile arındırılabilir. - Module – Encapsulation
file
ile encapsulation daha dosya bazlı ve net bir hale getirilebilir. - Test
Test sınıfları için kullanılabilir. Tabi test süreçlerinde bu sınıflara doğrudan erişim olmayacağından bunları kullanan sınıflar üzerinden testin gerçekleştirilmesi gerekecektir.
Kaynak: Gençay Yıldız
Hiç Yorum Yapılmamış. İlk Yorumu Sen Yap