Variansi (in/out) dengan antarmuka dan delegasi
Pahami variansi C#: out untuk produsen (kovariansi) dan in untuk konsumen (kontravariansi) pada antarmuka dan delegasi.
Variansi (in/out) dengan antarmuka dan delegasi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. 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 3 pelajaran total.
Ikhtisar variansi
Variansi memungkinkan antarmuka/delegasi generik bekerja dengan pewarisan.
- out = kovariansi (penghasil)
- in = kontravariansi (konsumen)
- Aman jika API hanya menghasilkan atau hanya menggunakan T
Demonstrasi kovariansi
IEnumerable<out T> bersifat kovarian: urutan kucing dapat digunakan saat urutan hewan diharapkan.
using System;
using System.Collections.Generic;
public class Animal { public virtual string Name() { return "animal"; } }
public class Cat : Animal { public override string Name() { return "cat"; } }
public class Program
{
static void PrintAll(IEnumerable<Animal> animals)
{
foreach (Animal a in animals)
{
Console.WriteLine(a.Name());
}
}
public static void Main(string[] args)
{
List<Cat> cats = new List<Cat>();
cats.Add(new Cat());
// IEnumerable<Cat> -> IEnumerable<Animal> is allowed (out T)
PrintAll(cats);
}
}
Demonstrasi kontravariansi
IComparer<in T> bersifat kontravarian: pembanding untuk Animal juga berfungsi untuk Cat karena hanya mengonsumsi T.
using System;
using System.Collections.Generic;
public class Animal { public string N; public Animal(string n){ N=n; } }
public class Cat : Animal { public Cat(string n) : base(n) {} }
// Comparer can compare any Animals
public class AnimalNameComparer : IComparer<Animal>
{
public int Compare(Animal x, Animal y)
{
return string.Compare(x == null ? "" : x.N, y == null ? "" : y.N, StringComparison.Ordinal);
}
}
public class Program
{
public static void Main(string[] args)
{
List<Cat> cats = new List<Cat>();
cats.Add(new Cat("Miso"));
cats.Add(new Cat("Ada"));
// IComparer<Animal> can be used as IComparer<Cat> (in T)
cats.Sort(new AnimalNameComparer());
foreach (Cat c in cats) Console.WriteLine(c.N);
}
}
Variansi delegasi
Delegasi juga bervariansi: Func<out TResult> (produsen) dan Action<in T> (konsumen).
using System;
public class Animal { public virtual string Speak(){ return "???"; } }
public class Cat : Animal { public override string Speak(){ return "meow"; } }
public class Program
{
static Animal MakeAnimal() { return new Animal(); }
static void HandleAnimal(Animal a) { Console.WriteLine(a.Speak()); }
public static void Main(string[] args)
{
// Func<Cat> can be used where Func<Animal> is expected? Yes, because TResult is out.
Func<Animal> maker = new Func<Cat>(delegate { return new Cat(); });
Console.WriteLine(maker().Speak());
// Action<Animal> can be used where Action<Cat> is expected? Yes, because T is in.
Action<Cat> catSink = new Action<Animal>(HandleAnimal);
catSink(new Cat());
}
}
Antarmuka kustom bervariansi
Aturan desain: tandai parameter yang hanya menghasilkan nilai dengan out dan parameter yang hanya mengonsumsi nilai dengan in untuk memungkinkan konversi yang aman.
using System;
// Producer-only interface: out T
public interface ISource<out T>
{
T Get();
}
// Consumer-only interface: in T
public interface ISink<in T>
{
void Put(T item);
}
public class Animal { public string N; }
public class Cat : Animal { }
public class CatSource : ISource<Cat>
{
public Cat Get() { return new Cat(); }
}
public class AnimalSink : ISink<Animal>
{
public void Put(Animal a) { Console.WriteLine("Got animal"); }
}
public class Program
{
public static void Main(string[] args)
{
ISource<Animal> animals = new CatSource(); // out T allows upcast
ISink<Cat> cats = new AnimalSink(); // in T allows down-assign
animals.Get();
cats.Put(new Cat());
}
}
Kiat variansi
Kiat:
- Parameter out hanya boleh muncul pada posisi keluaran (jenis hasil, posisi kovarian).
- Parameter in hanya boleh muncul pada posisi masukan (parameter metode).
- Jangan mencampur operasi menghasilkan dan mengonsumsi untuk T yang sama saat mendeklarasikan variansi.
- Variansi berlaku untuk antarmuka dan delegasi, bukan kelas.
Kata kunci kovarian
Ringkasan
Ringkasan: Gunakan out untuk produsen (kovariansi) dan in untuk konsumen (kontravariansi) pada antarmuka dan delegasi. Jaga agar API berjalan satu arah untuk memungkinkan konversi yang aman.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Variansi (in/out) dengan antarmuka dan delegasi” gratis?
Ya — teks lengkap “Variansi (in/out) dengan antarmuka dan delegasi” 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 3 pelajaran total.
Apa yang akan aku pelajari di “Variansi (in/out) dengan antarmuka dan delegasi”?
Pahami variansi C#: out untuk produsen (kovariansi) dan in untuk konsumen (kontravariansi) pada antarmuka dan delegasi. 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 2 dari 3.
Berapa lama pelajaran “Variansi (in/out) dengan antarmuka dan delegasi” 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
- Metode/tipe generik; batasan
- Variansi (in/out) dengan antarmuka dan delegasi
- Tipe referensi nullable (pemahaman) & anotasi (pola C# 6)