2009-06-03 11 views
10

,Func <T, TResult> ve Dönüştürücü <TInput, TOutput> arasındaki fark nedir? Func ve Dönüştürücü delegeleri için imzalar baktığımızda

public delegate TResult Func<T, TResult>(T arg); 
public delegate TOutput Converter<TInput, TOutput>(TInput input); 

ikisi arasındaki farkı görmek için mücadele ediyorum. Elbette, jenerik tür argümanlarını yeniden adlandırırsak, aslında aynı şeylere mi sahipler?

Neden herkesin var olduğunu açıklayabilir mi, lütfen?

cevap

17

Fark yoktur. Varoluşlarının nedeni tarihseldir. Converter<T1,T2> zaten .NET 2.0'da kullanılabilir, ancak daha sonra bir dizi Func<> delege türü eklenmiştir. Tutarlılık için Func<T,TResult> eklenmiştir, ancak Converter<T1,T2> ile aynı şeyi yapmıştır. .NET 2.0'a

+0

Size en doğru silahı verdiğiniz için size en doğru cevabı verdik :) –

6

eklenmiştir. Çeşitli Func s, 3.5 (sanırım) eklenmiştir. Şüphesiz, çerçeve tasarımcıları "Hey, bunun için genel bir temsilci var" demişti, ama diğer tüm Func'lara sahip olmak için çok tuhaf görünüyordu. Ve kırılmadan kaçınmak için Converter yerinde bırakılmalıdır.

  • ThreadStart
  • MethodInvoker
  • Action

tüm

aynı void Foo() imzaya sahip: Örneğin -

8

aynı effictively olan temsilci türleri çok sayıda bulunmaktadır. Tarihsel olarak, isimler özel kullanım tarafından seçilmiştir; Onlar uymayacak gerçekten uyumlu değildir dolayısıyla (ailelerin delegelerin) Ne yazık ki

onlar Func<...> ve Action<...> gibi şeyler tanıtıldı .NET 3.5 - ama LINQ ve seyir yönlendirirse, imza odaklanmak daha net görünüyor Seviye, bu yüzden eğer her ikisini de kullanıyorsanız, genellikle aralarında shim var. Bu acıdır ...

İlgili konular