NRT'yi Etkinleştirme ve Anlama
Nullable bağlamını etkinleştirin, nullable ve non-nullable başvuru türlerini anlayın ve derleyici uyarılarını okuyun.
NRT'yi Etkinleştirme ve Anlama, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Milyar Dolarlık Hata
null kavramının mucidi Tony Hoare, bunu "milyar dolarlık hatası" olarak nitelendirmiştir. C# dilinde varsayılan olarak her başvuru türü null olabilir; bu da NullReferenceException hatasını en yaygın çalışma zamanı çökmesine dönüştürür. Nullable Reference Types (NRT) bu sorunu derleyici düzeyinde çözer.
Nullable Bağlamını Etkinleştirme
NRT'yi proje dosyanızda genel olarak veya yönergelerle dosya bazında etkinleştirin. Etkinleştirildiğinde derleyici, başvuru türlerini varsayılan olarak null kabul etmeyen türler olarak ele alır.
<!-- In .csproj — enable for the whole project -->
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
// Or per-file:
#nullable enable
// ... code with NRT warnings
#nullable disable
// ... code without NRT warningsNull Kabul Etmeyen ve Nullable Başvuru Türleri
NRT etkin olduğunda: string değerin asla null olmayacağı anlamına gelir, string? ise değerin null olabileceği anlamına gelir. Derleyici, null değerini null kabul etmeyen bir türe atadığınızda veya nullable bir değeri denetlemeden kullandığınızda uyarır.
#nullable enable
string nonNull = "Hello"; // OK
string? maybeNull = null; // OK — explicitly nullable
nonNull = null; // WARNING: CS8600
Console.WriteLine(maybeNull.Length); // WARNING: CS8602 — may be null
// Fix:
if (maybeNull is not null)
Console.WriteLine(maybeNull.Length); // safeAkış Analizi
Derleyici akış analizi gerçekleştirir; koşullar ve dallar boyunca null durumunu izler, bir değerin null olmadığını kanıtlayabildiğinde uyarıları bastırır.
string? name = GetName();
// After null check, name is treated as non-null:
if (name is not null)
Console.WriteLine(name.Length); // no warning
// Same with early return:
if (name is null) return;
Console.WriteLine(name.Length); // no warning — null was returned
// Pattern matching:
if (name is string s)
Console.WriteLine(s.ToUpper()); // no warningNullable Uyarıları: CS8600–CS8629
Anlaşılması gereken temel NRT uyarıları: CS8600 (null değerini null kabul etmeyen türe atama), CS8602 (null olabilecek bir değeri kullanma), CS8603 (null kabul etmeyen tür için null döndürme), CS8618 (başlatılmamış null kabul etmeyen alan).
#nullable enable
public class Order
{
public string CustomerName { get; set; } // CS8618: not initialized
public string? TrackingNumber { get; set; } // OK — nullable
public Order(string name)
{
CustomerName = name; // now initialized — CS8618 gone
}
}
string? s = GetValue();
Console.WriteLine(s.Length); // CS8602: s might be nullNull Kabul Etmeyen Alanları Başlatma
CS8618, null kabul etmeyen bir alan veya özellik oluşturucuda ayarlanmadığında oluşur. Çözümler: bildirimin içinde başlatmak, oluşturucu aracılığıyla zorunlu kılmak veya DI/ORM kalıpları için null affetme işleci kullanmak.
// Option 1: Initialize in declaration
public string Name { get; set; } = "";
// Option 2: Require via constructor
public class Product
{
public string Name { get; }
public Product(string name) => Name = name;
}
// Option 3: null-forgiving for ORM entities
public string Name { get; set; } = null!;
// null! tells compiler "trust me, this will be set by EF Core"Genel Türlerde Nullable Kullanımı
Genel tür parametreleri null kabul etmeyecek şekilde kısıtlanabilir. where T : notnull kısıtlaması, T değerinin hiçbir zaman null olamamasını sağlar.
// Without constraint: T could be nullable
public T? Find<T>(int id) { ... }
// With notnull: T must be a non-nullable type
public T FindRequired<T>(int id) where T : notnull
{
var result = InternalFind<T>(id);
return result ?? throw new KeyNotFoundException();
}
// T? is meaningful only when T is known to be non-nullable
public T? FindOrDefault<T>(int id) where T : class { ... }Arayüzlerde ve Geçersiz Kılmalarda Nullable Kullanımı
Bir arayüzü uygularken veya bir yöntemi geçersiz kılarken null olabilirlik öznitelikleri eşleşmelidir. Derleyici, uygulamaların arayüz bildirimindeki kadar null kabul etmeyen olmasını denetler.
public interface IRepository<T>
{
T? FindById(int id); // may return null
T GetOrThrow(int id); // never null
}
// Implementation:
public class ProductRepo : IRepository<Product>
{
public Product? FindById(int id) => _db.Find(id);
public Product GetOrThrow(int id) =>
_db.Find(id) ?? throw new KeyNotFoundException();
}Nullable Değer Türleri ve Nullable Başvuru Türleri
int? (Nullable<int> — C# 8'den önce de var olan bir değer türü sarmalayıcısı) ile string? (yalnızca derleme zamanında kullanılan ve çalışma zamanında ek maliyet oluşturmayan bir NRT özniteliği) kavramlarını karıştırmayın.
// Nullable value type (runtime Nullable<int>)
int? age = null;
bool hasValue = age.HasValue;
int value = age.GetValueOrDefault();
// Nullable reference type (compile-time annotation only)
string? name = null;
// string? has NO runtime wrapper — it's just a compile-time hint
// null check is still needed at runtime
if (name is not null)
Console.WriteLine(name.ToUpper());! ile Uyarıları Bastırma
Null affetme işleci (!), derleyiciden daha doğru bilgiye sahip olduğunuzda belirli bir nullable uyarısını bastırır. Bu işleci ölçülü kullanın ve neden güvenli olduğunu belgelendirin.
// Use ! when you know the value cannot be null
var user = _db.Users.FirstOrDefault(u => u.Email == email);
var name = user!.Name; // user is guaranteed by business logic
// EF Core navigation properties set by the framework:
public class Order
{
public Customer Customer { get; set; } = null!; // set by EF Core
}Gerçek Hayattan: Nullable API Yanıtı
JSON yanıtında alanların bulunabileceği veya bulunmayabileceği bir API sarmalayıcısı; nullable öznitelikleri amacı açıkça ifade eder.
#nullable enable
public class WeatherResponse
{
public string City { get; set; } = ""; // always present
public double Temperature { get; set; } // always present
public string? Description { get; set; } // optional field
public string? AlertMessage { get; set; } // only when there's an alert
}
// Consumer:
var weather = await api.GetWeatherAsync("London");
Console.WriteLine(weather.City); // safe
Console.WriteLine(weather.Description?.ToUpper() ?? "N/A"); // safe null-handlingHızlı Kontrol
Nullable Reference Types'ın (string?) normal başvuru türlerine (string) kıyasla çalışma zamanı ek maliyeti nedir?
Özet: NRT'yi Etkinleştirme ve Anlama
Temel çıkarımlar:
- .csproj içinde
<Nullable>enable</Nullable>ile genel olarak etkinleştirin string= asla null değil;string?= null olabilir- Akış analizi, dallar ve dönüşler boyunca null durumunu izler
- NRT öznitelikleri yalnızca derleme zamanında kullanılır; çalışma zamanında ek maliyet yoktur
- CS8618: null kabul etmeyen alanları oluşturucuda başlatın veya ORM için
= null!kullanın - ! işlecini ölçülü kullanın; null affetmenin neden güvenli olduğunu belgelendirin
Sıkça Sorulan Sorular
“NRT'yi Etkinleştirme ve Anlama” dersi ücretsiz mi?
Evet — “NRT'yi Etkinleştirme ve Anlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“NRT'yi Etkinleştirme ve Anlama” dersinde ne öğreneceğim?
Nullable bağlamını etkinleştirin, nullable ve non-nullable başvuru türlerini anlayın ve derleyici uyarılarını okuyun. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“NRT'yi Etkinleştirme ve Anlama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- NRT'yi Etkinleştirme ve Anlama
- Ek Açıklamalar: ?, !, MaybeNull ve NotNull
- Null Koşullu ve Null Birleştirme Operatörleri
- Bir Kod Tabanını NRT'ye Geçirme