0Pricing
C# Academy · Ders

Arayüzler ve temsilcilerle varyans (in/out)

C# varyansını anlayın: arayüzlerde ve temsilcilerde üreticiler (kovaryans) için out , tüketiciler (kontravaryans) için in kullanılır.

Arayüzler ve temsilcilerle varyans (in/out), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 2. 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 3 dersten oluşur.

Varyansa genel bakış

Varyans, genel arayüzlerin ve temsilcilerin kalıtımla çalışmasını sağlar.

  • dışa = kovaryans (üretici)
  • içe = karşıt varyans (tüketici)
  • Programlama arayüzü yalnızca T ürettiğinde veya yalnızca tükettiğinde güvenlidir

Kovaryans gösterimi

IEnumerable<out T> kovaryanttır: bir kedi dizisi, hayvan dizisinin beklendiği yerde kullanılabilir.

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

Kontravaryans gösterimi

IComparer<in T> kontravaryanttır: Animal için bir karşılaştırıcı, yalnızca T tükettiği için Cat için de çalışır.

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

delegate değişkenliği

delegate türleri de değişken olabilir: Func<out TResult> (üretici) ve Action<in T> (tüketici).

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

Özel değişken türdeki arayüzler

Tasarım kuralı: güvenli dönüştürmeleri etkinleştirmek için yalnızca üretici olan parametreleri out, yalnızca tüketici olanları in olarak işaretleyin.

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

Değişkenlik için ipuçları

İpuçları:

  • out parametreleri yalnızca çıktı konumlarında (dönüş türleri ve kovaryant konumlar) bulunabilir.
  • in parametreleri yalnızca girdi konumlarında (yöntem parametreleri) bulunabilir.
  • Değişkenlik tanımlarken aynı T için üretme ve tüketme işlemlerini birlikte kullanmayın.
  • Değişkenlik sınıflara değil, arayüzlere ve delegate türlerine uygulanır.

Kovaryans anahtar sözcüğü

Hızlı kontrol: Bir arayüzde veya delegate türünde kovaryant tür parametresini hangi anahtar sözcük işaretler?

Tekrar

Tekrar: Arayüzlerde ve delegate türlerinde üreticiler için out (kovaryans), tüketiciler için in (kontravaryans) kullanın. Güvenli dönüştürmeleri etkinleştirmek için API'leri tek yönlü tutun.

Sıkça Sorulan Sorular

“Arayüzler ve temsilcilerle varyans (in/out)” dersi ücretsiz mi?

Evet — “Arayüzler ve temsilcilerle varyans (in/out)” 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 3 dersten oluşur.

“Arayüzler ve temsilcilerle varyans (in/out)” dersinde ne öğreneceğim?

C# varyansını anlayın: arayüzlerde ve temsilcilerde üreticiler (kovaryans) için out , tüketiciler (kontravaryans) için in kullanılır. 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, 3 dersinin 2. dersidir.

“Arayüzler ve temsilcilerle varyans (in/out)” 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

  1. Generic yöntemler/türler ve kısıtlamalar
  2. Arayüzler ve temsilcilerle varyans (in/out)
  3. Null olabilen başvuru türleri (farkındalık) ve ek açıklamalar (C# 6 kalıpları)
← C# Academy Sayfasına Dön