Bir Kod Tabanını NRT'ye Geçirme
Aşamalı bir geçiş stratejisi uygulayın: uyarıları etkinleştirin, API'lere açıklama ekleyin, sorunları düzeltin ve yanlış pozitiflerden kaçının.
Bir Kod Tabanını NRT'ye Geçirme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. 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.
Geçiş Zorluğu
Mevcut bir kod tabanında NRT'yi etkinleştirmek genellikle yüzlerce uyarı üretir. Her şeyi tek seferde değiştirmeye çalışmak risklidir. Bunun yerine aşamalı bir geçiş uygulayın: uyarıları kademeli olarak etkinleştirin, uyarıları dosya dosya giderin ve ilerleme ivmesini asla kaybetmeyin.
1. Adım: Yalnızca Uyarıları Etkinleştirme
<Nullable>warnings</Nullable> ile başlayın; enable kullanmayın. Bu seçenek, ek açıklama içermeyen kodu hata olarak değerlendirmeden uyarıları etkinleştirir ve güvenli bir başlangıç noktası sunar.
<!-- Phase 1: warnings only, no breaking change -->
<PropertyGroup>
<Nullable>warnings</Nullable>
</PropertyGroup>
<!-- Phase 2: full enable per file as you migrate -->
<!-- Phase 3: switch to enable globally when done -->2. Adım: Dosya Bazında Etkinleştirme
Üzerinde çalıştığınız her dosyanın en üstüne #nullable enable ekleyin. Böylece değişiklikler yalnızca etkin olarak düzenlediğiniz dosyalarla sınırlı kalır ve incelemeler yönetilebilir olur.
#nullable enable
// Now this file has full NRT analysis
public class OrderService
{
private readonly IOrderRepository _repo;
// Compiler now warns about uninitialized non-nullable fields,
// unsafe dereferences, and assignment to non-nullable
public OrderService(IOrderRepository repo) => _repo = repo;
}
// Other files without #nullable enable are still uncheckedUyarıları Kategorilere Ayırma
Uyarılar iki kategoriye ayrılır: bastırılması güvenli olanlar (ORM varlıkları, DI tarafından eklenen alanlar) ve gerçek hatalar (gerçekte null olan değerlerin başvurulan nesne olarak kullanılması). Herhangi bir şeyi bastırmadan önce bu ayrımı yapın.
// Category 1: safe to suppress with null!
// EF Core navigation properties — set by EF, never null in practice
public class Order
{
public Customer Customer { get; set; } = null!;
}
// Category 2: real bug — must fix
public string GetFullName()
{
return FirstName + " " + LastName; // LastName was string? -- BUG!
}CS8618 Oluşturucu Uyarısını Giderme
CS8618, null olamayan bir özellik oluşturucuda ayarlanmadığında oluşur. Tercih edilen çözüm, bu değeri oluşturucuda zorunlu kılmaktır. = null! ifadesini yalnızca çerçeve tarafından ayarlanan değerler için kullanın.
// BEFORE (CS8618)
public class Product
{
public string Name { get; set; } // warning
public Category Category { get; set; } // warning
}
// AFTER — constructor required:
public class Product
{
public string Name { get; set; }
public Category Category { get; set; }
public Product(string name, Category category)
{
Name = name;
Category = category;
}
}Eski API'leri Ele Alma
Üçüncü taraf veya eski API'ler ek açıklama içermeyebilir. Bunların dönüş türleri belirsiz durumdadır; ne null olabilir ne de null olamaz kabul edilir. Açık olmak için sonuçlarını null olabilir değişkenlere atayın.
// Legacy API returns 'string' but might be null (oblivious type)
string? legacyResult = OldLibrary.GetValue(); // store as nullable
if (legacyResult is null) return;
// Or convert at the boundary:
string safe = OldLibrary.GetValue() ?? "";
// For third-party types, check if they have NRT annotations:
// NuGet packages often add nullable annotations in newer versionsBelirli Uyarıları Bastırmak için #pragma Kullanma
Bir uyarı gerçekten yanlış pozitif olduğunda ve = null! kullanımı fazla gürültü oluşturduğunda, yalnızca ilgili satırın kapsamına uygulanan #pragma warning disable ifadesini kullanın.
// Suppress for a specific case with explanation:
#pragma warning disable CS8618 // ORM populates this via reflection
public DbSet<Product> Products { get; set; }
#pragma warning restore CS8618
// Or inline with a comment:
public DbSet<Order> Orders { get; set; } = null!; // set by EF CoreNRT Uyarılarını Hata Olarak Ele Alma
Bir dosyadaki tüm uyarılar giderildikten sonra, gerilemeleri önlemek için <WarningsAsErrors>Nullable</WarningsAsErrors> ekleyin veya CI zorlaması kullanın; yeni bir null olabilirlik sorunu derlemenin başarısız olmasına neden olur.
<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- Or selectively: -->
<!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>Genel API'lere Ek Açıklama Ekleme
Kütüphaneniz başkaları tarafından kullanıldığında NRT ek açıklamaları, genel API sözleşmenizin bir parçası olur. Sonuç null olabiliyorsa T?, kesinlikle null olamıyorsa T döndürün.
public interface IProductService
{
// Contract: FindById MAY return null, GetById never does
Product? FindById(int id);
Product GetById(int id); // throws if not found
// Collection: never null (may be empty)
IReadOnlyList<Product> GetAll();
// String: may be empty but not null
string GetSummary(int id);
}Geçiş Ölçümleri ve İzleme
#nullable enable içeren dosyaları sayarak veya CI ortamında dotnet build 2>&1 | grep CS86 komutunu çalıştırarak ilerlemeyi izleyin. Projenin tamamının geçişi için bir hedef tarih belirleyin.
# Count NRT warnings in current build
dotnet build 2>&1 | grep -c 'CS860[0-9]\|CS861[0-9]\|CS862[0-9]'
# List files still missing #nullable enable
grep -rL '#nullable enable' src/ --include='*.cs'
# Track in CI: fail if warning count increases
# Set a budget: warnings <= N, where N decreases each sprintHızlı Denetim
Null olamayan bir özellikteki = null! ataması ne anlatır?
Özet: NRT'ye Geçiş
Önemli noktalar:
- Aşamalı geçiş kullanın: uyarı modu → dosya bazında etkinleştirme → genel etkinleştirme
- Gerçek hataları (giderin) ORM/DI desenlerinden (
= null!kullanın) ayırın - CS8618'i bastırarak değil, değerleri oluşturucularda zorunlu kılarak giderin
- Açık olmak için eski API sonuçlarını
T?değişkenlerine atayın - Gerilemeleri önlemek için null olabilirlik uyarılarını CI ortamında hata olarak ele alın
- Ek açıklamalı genel API'ler, tüketiciler için açık sözleşmelere dönüşür
Sıkça Sorulan Sorular
“Bir Kod Tabanını NRT'ye Geçirme” dersi ücretsiz mi?
Evet — “Bir Kod Tabanını NRT'ye Geçirme” 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.
“Bir Kod Tabanını NRT'ye Geçirme” dersinde ne öğreneceğim?
Aşamalı bir geçiş stratejisi uygulayın: uyarıları etkinleştirin, API'lere açıklama ekleyin, sorunları düzeltin ve yanlış pozitiflerden kaçının. 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 4. dersidir.
“Bir Kod Tabanını NRT'ye Geçirme” 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