Akademi C# · Pelajaran

Memigrasikan Pangkalan Kod kepada NRT

Gunakan strategi migrasi berperingkat: dayakan amaran, anotasi API, baiki isu dan elakkan positif palsu.

Pelajaran 4 daripada 412 langkah

Memigrasikan Pangkalan Kod kepada NRT ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Cabaran Migrasi

Mendayakan NRT pada pangkalan kod sedia ada biasanya menghasilkan ratusan amaran. Pendekatan sekaligus berisiko. Sebaliknya, gunakan migrasi berfasa: dayakan amaran secara berperingkat, baikinya fail demi fail, dan jangan biarkan momentum terhenti.

Langkah 1: Dayakan Amaran Sahaja

Mulakan dengan <Nullable>warnings</Nullable> dan bukannya enable. Ini mengaktifkan amaran tanpa menganggap kod yang tidak beranotasi sebagai ralat — titik permulaan yang selamat.

<!-- 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 -->

Langkah 2: Dayakan bagi Setiap Fail

Tambahkan #nullable enable pada bahagian atas setiap fail semasa Anda mengusahakannya. Ini mengehadkan perubahan kepada fail yang sedang Anda sunting, lalu memudahkan semakan.

#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 unchecked

Mengelaskan Amaran

Amaran terbahagi kepada dua kategori: selamat untuk ditindas (entiti ORM, medan yang disuntik melalui DI) dan pepijat sebenar (nilai yang sememangnya null sedang dinyahrujuk). Bezakan kedua-duanya sebelum menindas sebarang amaran.

// 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!
}

Membaiki Amaran Pembina CS8618

CS8618 berlaku apabila properti yang tidak boleh bernilai null tidak ditetapkan dalam pembina. Pembetulan yang disarankan ialah mewajibkan nilainya dalam pembina. Gunakan = null! hanya untuk nilai yang ditetapkan oleh rangka kerja.

// 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;
    }
}

Mengendalikan API Legasi

API pihak ketiga atau legasi mungkin tidak mempunyai anotasi. Jenis pulangannya bersifat tidak pasti (tidak nullable dan juga tidak ditandakan sebagai bukan nullable). Tetapkan hasilnya kepada pemboleh ubah yang boleh bernilai null supaya maksudnya jelas.

// 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 versions

Menggunakan #pragma untuk Menindas Amaran Tertentu

Apabila sesuatu amaran benar-benar merupakan positif palsu dan = null! kelihatan terlalu bising, gunakan #pragma warning disable dengan skop yang terhad kepada baris tertentu.

// 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 Core

Menganggap Amaran NRT sebagai Ralat

Setelah semua amaran dalam sesuatu fail dibaiki, tambahkan <WarningsAsErrors>Nullable</WarningsAsErrors> (atau gunakan penguatkuasaan CI) untuk mencegah kemunduran — sebarang isu nullable baharu akan menyebabkan binaan gagal.

<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
  <Nullable>enable</Nullable>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <!-- Or selectively: -->
  <!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>

Memberi Anotasi pada API Awam

Apabila pustaka Anda digunakan oleh pihak lain, anotasi NRT menjadi sebahagian daripada kontrak API awam Anda. Pulangkan T? apabila hasilnya boleh bernilai null; pulangkan T apabila hasilnya dijamin tidak null.

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);
}

Metrik dan Penjejakan Migrasi

Jejaki kemajuan dengan mengira fail yang mengandungi #nullable enable atau dengan menjalankan dotnet build 2>&1 | grep CS86 dalam CI. Tetapkan tarikh sasaran untuk migrasi projek sepenuhnya.

# 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 sprint

Semakan Pantas

Apakah yang dimaksudkan oleh penetapan = null! pada properti yang tidak boleh bernilai null?

Ringkasan: Migrasi kepada NRT

Inti pati utama:

  • Gunakan migrasi berfasa: mod amaran → dayakan bagi setiap fail → dayakan secara global
  • Bezakan pepijat sebenar (baikinya) daripada corak ORM/DI (gunakan = null!)
  • Baiki CS8618 dengan mewajibkan nilai dalam pembina, bukan dengan menindasnya
  • Tetapkan hasil API legasi kepada pemboleh ubah T? supaya maksudnya jelas
  • Anggap amaran nullable sebagai ralat dalam CI untuk mencegah kemunduran
  • API awam yang beranotasi menjadi kontrak yang jelas untuk pengguna
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Memigrasikan Pangkalan Kod kepada NRT” percuma?

Ya — teks penuh “Memigrasikan Pangkalan Kod kepada NRT” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Memigrasikan Pangkalan Kod kepada NRT”?

Gunakan strategi migrasi berperingkat: dayakan amaran, anotasi API, baiki isu dan elakkan positif palsu. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Memigrasikan Pangkalan Kod kepada NRT” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mendayakan & Memahami NRT
  2. Anotasi: ?, !, MaybeNull & NotNull
  3. Operator Bersyarat Nol & Penggabungan Nol
  4. Memigrasikan Pangkalan Kod kepada NRT
← Kembali ke Akademi C#