0Pricing
C# Academy · Pelajaran

Batasan where

Batasi parameter tipe.

Batasan where adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Mengapa Batasan Diperlukan

Secara bawaan, parameter tipe T diperlakukan hampir seperti object, sehingga kompiler hanya mengizinkan sedikit operasi terhadapnya. Batasan, yang ditulis dengan where, memberi tahu kompiler lebih banyak hal tentang T.

Dengan pengetahuan tersebut, Anda dapat memanggil metode, membuat instans, atau membandingkan nilai dengan aman.

void Show<T>(T value) where T : IFormattable
{
    // now ToString(format, provider) is available
}

Batasan Antarmuka

Batasan antarmuka mengharuskan T mengimplementasikan antarmuka tertentu. Isi metode kemudian dapat memanggil anggota antarmuka tersebut.

Di bawah ini, where T : IComparable<T> menjamin bahwa metode CompareTo tersedia.

T Max<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) >= 0 ? a : b;

Batasan Kelas Dasar

Anda dapat mengharuskan T diturunkan dari kelas dasar tertentu. Dengan demikian, anggota dari tipe dasar tersebut dapat digunakan di dalam kode generik.

Pola ini umum digunakan dalam kerangka kerja yang semua entitasnya memiliki tipe dasar yang sama.

class Animal { public string Name = ""; }

string NameOf<T>(T a) where T : Animal => a.Name;

Batasan class

where T : class mengharuskan T menjadi tipe referensi. Hal ini mengizinkan penetapan null dan pemeriksaan kesamaan referensi.

Batasan ini umum digunakan untuk repository, tembolok, dan apa pun yang menyimpan referensi yang dapat bernilai null.

T? FindOrNull<T>(bool found, T value) where T : class
    => found ? value : null;

Batasan struct

where T : struct mengharuskan T menjadi tipe nilai yang tidak dapat bernilai null. Dengan demikian, T dapat diperlakukan sebagai tipe nilai dan T? dapat digunakan sebagai tipe nilai yang dapat bernilai null.

Batasan ini digunakan oleh pembantu yang hanya bekerja dengan angka, enumerasi, atau struct kecil.

T? AsNullable<T>(T value) where T : struct
    => value;

Batasan new()

Batasan new() mengharuskan T memiliki konstruktor publik tanpa parameter. Isi metode kemudian dapat menulis new T().

Pabrik dan kumpulan objek mengandalkan fitur ini untuk membuat instans secara generik.

using System;

class Program
{
    static T Make<T>() where T : new() => new T();

    static void Main()
    {
        var list = Make<System.Collections.Generic.List<int>>();
        Console.WriteLine(list.Count);
    }
}

Menggabungkan Batasan

Anda dapat menerapkan beberapa batasan pada satu parameter. Aturan urutannya mengharuskan class atau struct berada di urutan pertama, kemudian kelas dasar, lalu antarmuka, dan new() di urutan terakhir.

Batasan tersebut ditulis setelah satu where dan dipisahkan dengan koma.

T Build<T>() where T : class, IComparable<T>, new()
    => new T();

Beberapa Klausa where

Jika sebuah metode atau kelas memiliki beberapa parameter tipe, setiap parameter mendapatkan klausa where sendiri. Klausa-klausa tersebut ditulis secara berurutan.

Dengan demikian, batasan untuk setiap parameter tetap terpisah dengan jelas.

TResult Convert<TInput, TResult>(TInput x)
    where TInput : class
    where TResult : new()
    => new TResult();

Contoh Batasan yang Dapat Dijalankan

Program lengkap ini menggunakan batasan IComparable<T> untuk mencari nilai yang lebih besar dari dua nilai, baik untuk int maupun teks.

Batasan tersebut membuat CompareTo sah digunakan di dalam metode.

using System;

class Program
{
    static T Max<T>(T a, T b) where T : IComparable<T>
        => a.CompareTo(b) >= 0 ? a : b;

    static void Main()
    {
        Console.WriteLine(Max(3, 9));
        Console.WriteLine(Max("apple", "pear"));
    }
}

Batasan notnull dan unmanaged

C# versi baru menambahkan lebih banyak batasan. where T : notnull melarang tipe yang dapat bernilai null dan berguna untuk kunci kamus. where T : unmanaged membatasi T pada tipe nilai yang dapat direpresentasikan langsung dalam memori untuk kode tingkat rendah.

Batasan ini memperketat keamanan dalam skenario khusus.

void Use<T>(T key) where T : notnull { }

unsafe void Raw<T>(T v) where T : unmanaged { }

Batasan Membuka Kemampuan, Bukan Membatasi

Walaupun tampak seperti pembatasan, batasan sebenarnya membuka berbagai kemampuan. Tanpa batasan, Anda hampir tidak dapat melakukan apa pun terhadap T; dengan batasan, Anda mendapatkan akses ke anggotanya.

Pilih batasan minimal yang memungkinkan algoritma Anda bekerja agar parameter tipe tetap sefleksibel mungkin.

// No constraint: only object members available
string Name<T>(T x) => x.ToString();

Uji Singkat

Uji pemahaman Anda tentang batasan where.

Ringkasan

Klausa where membatasi parameter tipe: antarmuka, kelas dasar, class, struct, new(), notnull, dan unmanaged. Setiap batasan membuka operasi tertentu pada T.

Urutkan batasan dengan benar, gunakan satu klausa untuk setiap parameter, dan pilih batasan minimal yang diperlukan algoritma Anda.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batasan where” gratis?

Ya — teks lengkap “Batasan where” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Batasan where”?

Batasi parameter tipe. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Batasan where” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Metode Generik
  2. Kelas Generik
  3. Batasan where
  4. Antarmuka Generik
← Kembali ke C# Academy