Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# 11 İle Gelen File Scoped Types Özelliği

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;
C# 11 İle Gelen File Scoped Types Özelliği
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.
C# 11 İle Gelen File Scoped Types Özelliği
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.

File1.cs;

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;

File1.cs;

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.
C# 11 İle Gelen File Scoped Types ÖzelliğiC# 11 İle Gelen File Scoped Types ÖzelliğiBu 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.C# 11 İle Gelen File Scoped Types ÖzelliğiŞimdi bu noktaya kadar anlattıklarımızı şöyle aşağıdaki görselde olduğu gibi geniş manada özetleyelim;C# 11 İle Gelen File Scoped Types Özelliği

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

C# 11 İle Gelen File Scoped Types Özelliği
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.C# 11 İle Gelen File Scoped Types Özelliği 
 

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ı durumlar file 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.

İşte bu kadar 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Sultan dedi ki:

    Hocam, şu an junior yazılımcı olarak çalışıyorum. Kendimi güncel tutmak ve öğrenmek için blogunuzu bir çok kez talan ettim çok teşekkür ediyorum size verdiğiniz bilgiler için

  2. Enes dedi ki:

    Hocam uzun zamandır blog yazılarınızı okuyamıyordum. Şimdi okuma fırsatım oldu. Güncel konuları takip edip bize aktardığınız için teşekkür ederim. Yaptığınız amme hizmetinden dolayı sizi destekliyoruz. Eksik olmayın değerli hocam. Saygılar

Gençay için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir