C# 14'te Yeni field Anahtar Kelimesi
[[academy-video-youtube({"vid": "_Z551_SKHA4", "start_time": "0", "title": "The New field Keyword in C# 14", "creator": "Tim Corey", "length": "10m 35s"})]]
C#'taki otomatik özellikler kısadır, ancak bir setter'da geçerlilik doğrulama veya dönüşüm mantığına ihtiyaç duyduğunuzda, bunlardan tamamen vazgeçmek ve manuel destek alanıyla tam bir özellik yazmak zorunda kaldınız. Bu, tek bir koruma ifadesi eklemek için yedi satıra geçiş yapmak zor bir vergidir. C# 14, boşluğu kapatmak için field anahtar kelimesini tanıtarak, derleyicinin destek alanını sizin için yönetmeye devam ederken bir getter veya setter'ı özelleştirmenize olanak tanır.
Tim Corey, 'The New field Keyword in C# 14' başlıklı videosunda bu özelliğin hangi sorunu çözdüğünü gösteriyor, setter validasyonunun pratik örneklerini ele alıyor ve yükseltmeden önce bilmeniz gereken bir isimlendirme çatışmasını ele alıyor. Her adımı detaylıca takip edeceğiz, böylece field'yi kendi özelliklerinizde güvenle kullanmaya başlayabilirsiniz.
Kurma: Basit Bir Kişi Modeli
[0:12 - 1:07] Tim, .NET 10 ve Visual Studio 2026 altında çalışan bir konsol uygulamasıyla başlıyor. Demo, birkaç özelliğe sahip bir Person sınıfına odaklanıyor:
public required string FirstName { get; set; }
public required string LastName { get; set; }
public int Age { get; set; }public required string FirstName { get; set; }
public required string LastName { get; set; }
public int Age { get; set; }Ayrıca isim çatışması ortaya çıktığında ilgili hale gelen özel bir alan tarafından desteklenen bir Demo özelliği de vardır. Program.cs ile, Tim, FirstName = "Tim" ve LastName = "Corey" ile bir örnek oluşturur ve ardından soyadı, yaşı ve demo değerini yazdırır. Her şey beklendiği gibi çıkar: 'Corey', 0 (varsayılan tamsayı) ve 'test'.
Sorun: Otomatik Özellikler Hatalı Veri Kabul Eder
[1:23 - 2:49] Tim, null'yı kurulumdan sonra LastName'ya atadığında sorun ortaya çıkar:
p.LastName = null;p.LastName = null;LastName, required olarak işaretlense ve null olamaz bir dize türünde olsa da, atama derlenir. required modifikatörü sadece nesne başlatma sırasında bir değerin sağlandığını garanti eder; daha sonra özelliğin null olarak ayarlanmasını engellemez. Sonuç olarak, çalışma zamanında boş bir soyadıyla hata fırlatılmadan kalır.
Bu, veri bütünlüğünde gerçek bir boşluktur. Tür sistemi, bir nullable referans dalgasıyla sizi uyarır, ama bu, çalışma zamanı koruması değil derleme zamanı bir ipucudur. Uygulamanız her zaman geçerli bir dize içeren LastName'ya dayanıyorsa, oto-özellikler yalnız başına bu sözleşmeyi sağlamayacaktır.
Eski Çözüm: Manuel Destek Alanlı Tam Özellikler
[2:58 - 4:19] C# 14 öncesinde, standart çözüm, otomatik özelliği bir destek alanı ile birlikte tam bir özelliğe dönüştürmekti:
private string _lastName;
public required string LastName
{
get => _lastName;
set => _lastName = value ?? throw new ArgumentNullException(nameof(LastName));
}private string _lastName;
public required string LastName
{
get => _lastName;
set => _lastName = value ?? throw new ArgumentNullException(nameof(LastName));
}Tim bunu çalıştırır ve istisnanın doğru şekilde ateşlendiğini doğrular: "Değer boş olamaz. Parametre adı: LastName." Yaklaşım işe yarar, ancak bir özel alan beyan etmeyi, hem getter'ı hem de setter'ı çalıştırmayı ve özelliğin adını birden fazla satırda tekrarlamayı gerektirir. Tek bir doğrulama kuralı için bu oldukça fazla formalitedir.
Bu durumda getter özel bir şey yapmaz; değiştirilmeden alanı döner. Yine de otomatik özellik alanından çıkınca her iki yarımın da yazılması gerektiği için açıkça yazmanız gerekir. Tim, bu kelime fazlalığının yeni özelliğin arkasındaki motivasyon olarak çerçeveler.
Çözüm C# 14: field Anahtar Kelimesi
[4:23 - 5:47] C# 14, orta bir zemin sunar. Özel bir destek alanı kendiniz tanımlamak yerine, derleyici tarafından oluşturulan destek alanına doğrudan referans vermek için bir getter veya setter içinde field bağlamsal anahtar kelimesini kullanabilirsiniz:
public required string LastName
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(LastName));
}public required string LastName
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(LastName));
}Getter, gövde gerektirmeyen oto-uygulanan bir get; olarak kalır. Setter, doğrulamadan sonra gelen value'yı atamak için field kullanır. Derleyici, basit bir otomatik özellikde olduğu gibi sahne arkasında destek alanını oluşturur ve yönetir.
Demoyu çalıştırmak, null atamada aynı ArgumentNullException'yı üretir. Davranış, yedi satırdan özelleştirilen bloğa indirgenmiş olarak, manuel destekli sürümle aynı, sadece özelleştirilmesi gereken şeyi özelleştirir. Otomatik özellik getter'ını tutarsınız, yalnızca setter'a mantık eklersiniz ve manuel alan beyanını tamamen atlamış olursunuz.
Bu, düz bir otomatik özellik (bir satır, doğrulama yok) ile tam bir özellik (yedi veya daha fazla satır, tam kontrol) arasında faydalı bir orta adım sağlar. Mantığınız yalnızca setter'a dokunduğunda, getter'ı yeniden yazmanın sözdizimsel maliyetini artık ödemezsiniz.
Bir Setter Koruması ile Yaşı Doğrulama
[6:16 - 7:39] field'nın sadece null kontrolleri ile sınırlı olmadığını göstermek için, Tim Age özelliğine aralık doğrulama ekler:
public int Age
{
get;
set
{
if (value > 0 && value < 120)
field = value;
}
}public int Age
{
get;
set
{
if (value > 0 && value < 120)
field = value;
}
}Burada setter, makul bir aralığın dışındaki değerleri sessizce görmezden gelir. -5 atandığında Age sıfır olarak kalır çünkü şart başarısız oldu ve field asla yazılmadı. Tim bir istisna fırlatabileceğinizi belirtir, ancak sessiz yaklaşım, setter gövdesinin ihtiyaç duyduğunuz herhangi bir mantığı içerebileceğini ve hala depolama için field'ye güvendiğini gösterir.
Desen geniş bir şekilde uygulanır: sayısal aralıkların kısaltılması, dizelerden boşlukların kırpılması, büyük harf küçük harf normalleştirmesi veya bir özelliğe her ayarlandığında uygulamak istediğiniz herhangi bir dönüşüm.
Mevcut field Değişkenleriyle İsim Çatışmaları
[7:39 - 9:43] Tim, kasıtlı bir kenar durumu tanıtır. Demo sınıfında kelimenin tam anlamıyla field adlı özel bir üye vardır:
private string field = "test";private string field = "test";C# 14 etkin hale geldikten sonra, derleyici, bir özellik erişici içindeki field'yi değişken yerine anahtar kelime olarak ele alır. Bu, field'ya referans veren bir özelliğin, "test" içeren dize üye yerine özelliğin arkasındaki gizli depolamadan sessizce okuma yaptığı anlamına gelir (boş olan). Çıktı derleme hatası olmadan boş olarak değişir, sadece bir uyarı.
İki çözüm yolu vardır. this.field ile önekleme, derleyiciye sınıf düzeyindeki üyeyi kastettiğinizi, anahtar kelimeyi değil, söyler. Alternatif olarak, @field kaçağı aynı şekilde çalışır.
// Both refer to the instance variable, not the keyword
string demo => this.field;
string demo => @field;// Both refer to the instance variable, not the keyword
string demo => this.field;
string demo => @field;Tim'in güçlü önerisi, C# 14'e yükselttiğinizde field adlı herhangi bir değişkeni yeniden adlandırmaktır. IDE'nizde hızlı bir "Tümünü Yeniden Adlandır" temelli belirsizliği kalıcı olarak ortadan kaldırır. Çatışma yalnızca özellik erişicileri içinde ortaya çıkar; yapıcılar ve yöntemler, bu bağlamlarda örtük bir destek depolama olmadığından field'yi değişken adı olarak çözer.
Sonuç: Daha Az Formalite, Aynı Kontrol
[10:04 - 10:28] field anahtar kelimesi, günlük C# kodunda pratik bir boşluğu doldurur. Bir koruma ifadesine veya dönüşüme ihtiyaç duyan özellikler artık manuel destek alanlarıyla tam bir yeniden yazım gerektirmez. Sadece mantık gerektiren erişiciyi özelleştirir ve diğerini standart otomatik uygulama olarak bırakırsınız.
Sonuç
[10:28 - 10:35] Özetlemek gerekirse: C# 14'ün field anahtar kelimesi, herhangi bir özellik erişici içinde örtük destek deposuna doğrudan erişim sağlar. Bunu, setter doğrulaması, getter dönüşümleri veya her ikisini de eklemek için kullanın, otomatik özellik sözdiziminden özelleştirme gerektirmeyen bölümler için vazgeçmeyin.
Yükseltmeden önce, kod tabanınızda field adlı herhangi bir değişkeni arayın ve onları yeniden adlandırın. Bu tek temkin, bu özelliğin tanıttığı tek gerçek sıkıntıyı önler. Bunun ötesinde, çoğu geliştiricinin modellerini zaten yapılandırma şeklini doğal olarak uyum sağlayan temiz bir formalite azalmasıdır.
Örnek İpucu: Sadece setter'ı doğrulamanız gerekiyorsa, gövde olmadan düz bir get; olarak getter'ı bırakın. Derleyici, bunu otomatik bir özellik getter'ı olarak işler, ve hiçbir katkı sağlamayan bir geçiş return ifadesi yazmaktan kaçınırsınız.
C# dil özellikleri hakkında daha fazla bilgi edinmek için YouTube'daki videoyu ve Kanalını izleyin.

