Genişletme Yöntemi Çözümlemesi
Derleyicinin genişletmeleri nasıl bulduğunu anlayın.
Genişletme Yöntemi Çözümlemesi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. 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.
Derleyici Uzantıları Nasıl Bulur
value.Method() yazdığınızda ve eşleşen bir örnek yöntemi olmadığında derleyici bir uzantı yöntemi arar. Ancak yalnızca barındıran ad alanı bir using yönergesi aracılığıyla kapsamda olan uzantıları dikkate alır.
using Yönergeleri Uzantıları Kapsama Alır
Bir uzantı yalnızca kendi ad alanını içe aktarırsanız görünür olur. Doğru using yönergesi olmadan yöntem, derlemeye dahil edilmiş olsa bile yokmuş gibi görünür.
using System;
using MyHelpers; // brings StringExtensions into scope
namespace MyHelpers
{
public static class StringExtensions
{
public static string Reverse(this string s)
{
var arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("hello".Reverse());
}
}Örnek Yöntemler Önce Denetlenir
Derleyici çağrıyı aşamalar hâlinde çözümler: önce eşleşen bir örnek yöntemi, devralınanlar da dahil olmak üzere, arar. Yalnızca hiçbiri uygun değilse uzantı yöntemlerini arar.
using System;
using System.Collections.Generic;
public static class ListExt
{
// Ignored: List<int> already has Add(int)
public static void Add(this List<int> list, int a, int b)
=> list.Add(a + b);
}
public class Program
{
public static void Main()
{
var list = new List<int>();
list.Add(5); // the built-in instance Add wins for this signature
Console.WriteLine(list[0]);
}
}Daha Yakın Ad Alanları Tercih Edilir
İki uzantı eşleşirse, iç içe geçme hiyerarşisinde daha yakın olan ad alanındaki uzantı kazanır. Derleyicinin çözemediği bir belirsizlik derleme hatasına yol açar ve sizi belirsizliği gidermeye zorlar.
using System;
namespace Outer
{
public static class A { public static string Tag(this int n) => "A" + n; }
namespace Inner
{
public static class B { public static string Tag(this int n) => "B" + n; }
public class Program
{
public static void Main()
{
// B is in the nearer (Inner) namespace, so it is preferred
Console.WriteLine(7.Tag());
}
}
}
}Statik Çağrıyla Belirsizliği Giderme
Uzantılar çakıştığında veya açıkça belirtmek istediğinizde, statik yöntemi tam sınıf adını kullanarak doğrudan çağırın. Bu, uzantı çözümlemesini tamamen devre dışı bırakır.
using System;
public static class FormatExt
{
public static string Bracket(this string s) => "[" + s + "]";
}
public class Program
{
public static void Main()
{
// Explicit static call, no ambiguity possible
Console.WriteLine(FormatExt.Bracket("x"));
}
}Uzantılar Arasında Aşırı Yükleme Çözümlemesi
Birkaç uzantı yöntemi aynı adı taşıyorsa normal aşırı yükleme çözümlemesi, tıpkı sıradan yöntem aşırı yüklemesinde olduğu gibi parametre türlerine göre en iyi eşleşmeyi seçer.
using System;
public static class PrintExt
{
public static string Describe(this int n) => "int:" + n;
public static string Describe(this string s) => "str:" + s;
}
public class Program
{
public static void Main()
{
Console.WriteLine(42.Describe());
Console.WriteLine("hi".Describe());
}
}Çözümleme Sırasında Genel Tür Çıkarımı
Genel uzantılarda derleyici, tür bağımsız değişkenlerini alıcıdan ve bağımsız değişkenlerden çıkarır. Çıkarım başarısız olursa uzantı dikkate alınmaz.
using System;
using System.Collections.Generic;
public static class SeqExt
{
public static T FirstItem<T>(this IEnumerable<T> source)
{
foreach (var item in source) return item;
throw new InvalidOperationException("empty");
}
}
public class Program
{
public static void Main()
{
var nums = new List<int> { 5, 6, 7 };
// T inferred as int from the List<int> receiver
Console.WriteLine(nums.FirstItem());
}
}Global using ve Örtük İçe Aktarmalar
Modern C#, bir ad alanının projenin tamamında kapsamda olması için global using yönergeleri bildirebilir. Böylece paylaşılan uzantı kitaplıkları, içe aktarmalar tekrarlanmadan her yerde kullanılabilir.
using System;
// In a real project a separate file might say: global using MyHelpers;
namespace MyHelpers
{
public static class IntExt { public static int Twice(this int n) => n * 2; }
}
public class Program
{
public static void Main()
{
// Works here because MyHelpers is referenced explicitly
Console.WriteLine(MyHelpers.IntExt.Twice(8));
}
}Alıcı Türünün Önem Taşıdığı Durumlar
Çözümleme, alıcının çalışma zamanı türüne değil, statik türüne bağlıdır. Bir temel tür için bildirilen uzantı, değişken türetilmiş bir örnek taşısa bile uygulanır; ancak kapsamda daha özel bir uzantı varsa durum değişebilir.
using System;
public class Animal { }
public class Cat : Animal { }
public static class AnimalExt
{
public static string Kind(this Animal a) => "animal";
}
public class Program
{
public static void Main()
{
Animal a = new Cat();
// Chosen by static type Animal
Console.WriteLine(a.Kind());
}
}Çözümleme İçin Zihinsel Bir Model
Sırayı şöyle düşünün: (1) örnek yöntemleri, ardından (2) içe aktarılan ad alanlarındaki uzantı yöntemlerini, en yakından başlayarak, sonra da (3) adaylar arasındaki aşırı yükleme çözümlemesini. Bu sırayı bilmek, şaşırtıcı sonuçların neredeyse tamamını açıklar.
using System;
public static class Ext
{
public static string Wrap(this string s) => "<" + s + ">";
}
public class Program
{
public static void Main()
{
// No instance Wrap exists, so the extension is used
Console.WriteLine("node".Wrap());
}
}Kendiniz Deneyin
Bir ad alanında uzantı tanımlayın, bu ad alanını içe aktarın ve uzantıyı çağırın. Ardından her iki yolun da çalıştığını görmek için aynı yöntemi açıkça statik yöntem olarak çağırın.
using System;
using Text.Helpers;
namespace Text.Helpers
{
public static class StringExtensions
{
public static int Vowels(this string s)
{
int count = 0;
foreach (var c in s.ToLower())
if ("aeiou".IndexOf(c) >= 0) count++;
return count;
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("education".Vowels());
Console.WriteLine(Text.Helpers.StringExtensions.Vowels("education"));
}
}Hızlı Kontrol
Bir uzantı yöntemini görünür kılan şeyin ne olduğunu düşünün.
Özet
Uzantı yöntemi çözümlemesi açık bir sırayı izler.
- Önce örnek yöntemleri denenir; uzantılar yalnızca eksikleri tamamlar.
- Bir uzantı yalnızca ad alanı
usingveyaglobal usingaracılığıyla kapsamdaysa görünürdür. - Daha yakın ad alanları kazanır; çözülemeyen eşleşmeler derleme hatasına yol açar.
- Belirsizliği gidermek için statik yöntemi her zaman açıkça çağırabilirsiniz.
- Çözümleme, alıcının statik türünü kullanır.
Sıkça Sorulan Sorular
“Genişletme Yöntemi Çözümlemesi” dersi ücretsiz mi?
Evet — “Genişletme Yöntemi Çözümlemesi” 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.
“Genişletme Yöntemi Çözümlemesi” dersinde ne öğreneceğim?
Derleyicinin genişletmeleri nasıl bulduğunu anlayın. 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 3. dersidir.
“Genişletme Yöntemi Çözümlemesi” 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
- Genişletme Yöntemlerini Tanımlama
- Arabirimleri ve Generics'i Genişletme
- Genişletme Yöntemi Çözümlemesi
- İyi Genişletmeler Tasarlama