Aracılığıyla paylaş


Kesin Tür Belirtilmiş Temsilciler

Geri

Önceki makalede, anahtar sözcüğünü kullanarak belirli temsilci türleri oluşturduğunuzu delegate gördünüz.

Soyut Delegate sınıfı, gevşek bağlama ve çağırma için altyapı sağlar. Somut Temsilci türleri, temsilci nesnesi için çağırma listesine eklenen yöntemler için tür güvenliğini benimserek ve zorunlu kılarak çok daha kullanışlı hale gelir. anahtar sözcüğünü delegate kullandığınızda ve somut bir temsilci türü tanımladığınızda, derleyici bu yöntemleri oluşturur.

Pratikte bu, farklı bir yöntem imzasına ihtiyacınız olduğunda yeni temsilci türleri oluşturulmasına yol açabilir. Bu çalışma bir süre sonra sıkıcı olabilir. Her yeni özellik için yeni temsilci türleri gerekir.

Neyse ki buna gerek yok. .NET Core çerçevesi, temsilci türlerine ihtiyacınız olduğunda yeniden kullanabileceğiniz çeşitli türler içerir. Bunlar genel tanımlardır, bu nedenle yeni yöntem bildirimlerine ihtiyacınız olduğunda özelleştirmeler bildirebilirsiniz.

Bu türlerden ilki türü ve çeşitli varyasyonlarıdır Action :

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.

Genel in tür bağımsız değişkenindeki değiştirici kovaryans makalesinde ele alınmıştır.

Temsilcinin Action gibi en fazla 16 bağımsız değişken içeren varyasyonları Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>vardır. Bu tanımların temsilci bağımsız değişkenlerinin her biri için farklı genel bağımsız değişkenler kullanması önemlidir: Bu size maksimum esneklik sağlar. Yöntem bağımsız değişkenlerinin aynı türde olması gerekmez, ancak olabilir.

Geçersiz dönüş türüne Action sahip herhangi bir temsilci türü için türlerden birini kullanın.

Çerçeve ayrıca değer döndüren temsilci türleri için kullanabileceğiniz çeşitli genel temsilci türleri içerir:

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity

Sonuç out genel türü bağımsız değişkenindeki değiştirici kovaryans makalesinde ele alınmıştır.

Temsilcinin Func gibi Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>en fazla 16 giriş bağımsız değişkeni olan varyasyonları vardır. Sonucun türü, kurala göre her zaman tüm Func bildirimlerdeki son tür parametresidir.

Değer döndüren herhangi bir temsilci türü için türlerden birini Func kullanın.

Temsilci için tek bir değer üzerinde test döndüren özel Predicate<T> bir tür de vardır:

public delegate bool Predicate<in T>(T obj);

Herhangi bir Predicate tür için yapısal olarak eşdeğer Func bir tür olduğunu fark edebilirsiniz Örneğin:

Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;

Bu iki türün eşdeğer olduğunu düşünebilirsiniz. Durum bu değildir. Bu iki değişken birbirinin yerine kullanılamaz. Bir türdeki değişkene diğer tür atanamaz. C# türü sistemi, yapıyı değil tanımlı türlerin adlarını kullanır.

.NET Core Kitaplığı'ndaki tüm bu temsilci türü tanımları, oluşturduğunuz ve temsilci gerektiren yeni bir özellik için yeni bir temsilci türü tanımlamanız gerekmediği anlamına gelir. Bu genel tanımlar, çoğu durumda ihtiyacınız olan tüm temsilci türlerini sağlamalıdır. Gerekli tür parametreleriyle bu türlerden birinin örneğini oluşturabilirsiniz. Genel hale getirilebilen algoritmalar söz konusu olduğunda, bu temsilciler genel türler olarak kullanılabilir.

Bu, zaman kazanmalı ve temsilcilerle çalışmak için oluşturmanız gereken yeni türlerin sayısını en aza indirmelidir.

Sonraki makalede, pratikte temsilcilerle çalışmaya yönelik çeşitli yaygın desenler göreceksiniz.

İleri