0Pricing
C# Academy · Ders

Arabirimleri ve Generics'i Genişletme

Tek seferde birçok türe davranış ekleyin.

Arabirimleri ve Generics'i Genişletme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 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 4 dersten oluşur.

Arabirimleri Genişletme

this parametresi bir arabirim olan bir genişletme yöntemi yazabilirsiniz. Arabirimi uygulayan her tür bu yöntemi anında kazanır. LINQ'in IEnumerable<T> türüne onlarca yöntem eklemesi tam olarak bu şekilde gerçekleşir.

Sıralanabilir Türler Üzerinde Genel Genişletme

Yöntemi T üzerinde genel tür kullanan bir yöntem hâline getirip IEnumerable<T> türünü genişlettiğinizde yardımcı, listeler, diziler, sorgu sonuçları ve daha fazlası gibi her türlü dizi üzerinde çalışır.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static bool IsEmpty<T>(this IEnumerable<T> source)
    {
        foreach (var item in source) return false;
        return true;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        Console.WriteLine(nums.IsEmpty());
        Console.WriteLine(new int[0].IsEmpty());
    }
}

Dizide Yineleme

Uzantı içinde parametreyi herhangi bir IEnumerable<T> gibi ele alırsınız. Burada LINQ'e güvenmeden bir toplam hesaplarız.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static int SumValues(this IEnumerable<int> source)
    {
        int total = 0;
        foreach (var n in source) total += n;
        return total;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums.SumValues());
    }
}

Yeni Bir Dizi Döndürme

Uzantılar diziler de döndürebilir. yield return ile birleştirildiklerinde tembel, LINQ tarzı işleçlere dönüşürler.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
    {
        bool take = true;
        foreach (var item in source)
        {
            if (take) yield return item;
            take = !take;
        }
    }
}

public class Program
{
    public static void Main()
    {
        var letters = new List<string> { "a", "b", "c", "d", "e" };
        foreach (var l in letters.EveryOther())
            Console.WriteLine(l);
    }
}

Genel Tür Kısıtları

Genel parametreyi belirli yetenekler gerektirecek şekilde kısıtlayabilirsiniz. Buradaki where T : IComparable<T>, en büyük değeri bulmak için öğeleri karşılaştırmamızı sağlar.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static T MaxItem<T>(this IEnumerable<T> source) where T : IComparable<T>
    {
        bool started = false;
        T best = default;
        foreach (var item in source)
        {
            if (!started || item.CompareTo(best) > 0) { best = item; started = true; }
        }
        return best;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 3, 9, 1, 7 };
        Console.WriteLine(nums.MaxItem());
    }
}

Özel Bir Arayüzü Genişletme

Kendi arayüzleriniz de bundan yararlanır. Bir arayüz tanımlayın, ardından ortak davranışı her uygulayıcıda yinelemek yerine uzantılar aracılığıyla ekleyin.

using System;

public interface INamed { string Name { get; } }

public class Dog : INamed { public string Name => "Rex"; }

public static class NamedExtensions
{
    public static string Greeting(this INamed n) => "Hello, " + n.Name;
}

public class Program
{
    public static void Main()
    {
        var d = new Dog();
        Console.WriteLine(d.Greeting());
    }
}

Birden Çok Tür Parametresi

Uzantılar birden çok tür parametresi üzerinde genellenebilir. Bu dönüştürme yardımcısı, bir işlev kullanarak bir dizi üzerinde eşleme yapar; tıpkı LINQ Select gibi.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static IEnumerable<TResult> Map<TSource, TResult>(
        this IEnumerable<TSource> source, Func<TSource, TResult> f)
    {
        foreach (var item in source) yield return f(item);
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        foreach (var s in nums.Map(n => "#" + n))
            Console.WriteLine(s);
    }
}

Yerleşik LINQ ile Birleştirme

Uzantı yöntemleriniz LINQ ile birlikte çalışır. Özel işlecinizi standart işleçlerle tek bir akıcı işlem hattında zincirleyebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;

public static class EnumerableExtensions
{
    public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
    {
        bool take = true;
        foreach (var item in source) { if (take) yield return item; take = !take; }
    }
}

public class Program
{
    public static void Main()
    {
        var nums = Enumerable.Range(1, 10);
        var result = nums.Where(n => n > 2).EveryOther().ToList();
        Console.WriteLine(string.Join(", ", result));
    }
}

IEnumerable'ı Genişletmek Birçok Türe Ulaşır

Diziler, listeler, sözlükler, karma kümeleri ve sorgu sonuçlarının tümü IEnumerable<T> uyguladığı için tek bir uzantı hepsini aynı anda kapsar.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static int CountItems<T>(this IEnumerable<T> source)
    {
        int n = 0;
        foreach (var item in source) n++;
        return n;
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new[] { 1, 2, 3 }.CountItems());
        Console.WriteLine(new HashSet<string> { "a", "b" }.CountItems());
    }
}

Bu Yaklaşım Neden İyi Ölçeklenir

Arayüz uzantıları kalıtım olmadan çok biçimli yardımcılar sağlar. Mantığı bir kez arayüze göre yazdığınızda, mevcut ve gelecekteki her uygulayıcı bu mantığı otomatik olarak kullanır.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static string JoinWith<T>(this IEnumerable<T> source, string sep)
    {
        return string.Join(sep, source);
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        Console.WriteLine(nums.JoinWith(" -> "));
    }
}

Kendiniz Deneyin

IEnumerable<T> üzerinde küçük bir genel işleç oluşturun ve bunu LINQ ile zincirleyin. Herhangi bir dizi türüyle nasıl çalıştığına dikkat edin.

using System;
using System.Collections.Generic;
using System.Linq;

public static class EnumerableExtensions
{
    public static IEnumerable<T> WithoutDuplicatesByKey<T, TKey>(
        this IEnumerable<T> source, Func<T, TKey> keySelector)
    {
        var seen = new HashSet<TKey>();
        foreach (var item in source)
            if (seen.Add(keySelector(item))) yield return item;
    }
}

public class Program
{
    public static void Main()
    {
        var words = new[] { "apple", "avocado", "banana", "cherry", "blueberry" };
        var firstPerLetter = words.WithoutDuplicatesByKey(w => w[0]);
        Console.WriteLine(string.Join(", ", firstPerLetter));
    }
}

Hızlı Kontrol

LINQ tarzı uzantıların nasıl bildirildiğini düşünün.

Özet

Arayüzleri, özellikle IEnumerable<T> arayüzünü genişletmek, LINQ tarzı programlamanın temelidir.

  • Yöntemi genel hâle getirin ve arayüzü this türü olarak kullanın.
  • Tembel işleçler oluşturmak için yield return kullanın.
  • IComparable<T> gibi yetenekleri zorunlu kılmak için where kısıtlamalarını uygulayın.
  • Tek bir arayüz uzantısı, gelecektekiler de dahil olmak üzere tüm uygulayıcıları kapsar.

Sıkça Sorulan Sorular

“Arabirimleri ve Generics'i Genişletme” dersi ücretsiz mi?

Evet — “Arabirimleri ve Generics'i Genişletme” 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.

“Arabirimleri ve Generics'i Genişletme” dersinde ne öğreneceğim?

Tek seferde birçok türe davranış ekleyin. 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 2. dersidir.

“Arabirimleri ve Generics'i Genişletme” 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. Genişletme Yöntemlerini Tanımlama
  2. Arabirimleri ve Generics'i Genişletme
  3. Genişletme Yöntemi Çözümlemesi
  4. İyi Genişletmeler Tasarlama
← C# Academy Sayfasına Dön