2009-05-18 28 views
73

Birisi Func<int, string>'un ne olduğunu ve bazı açık örneklerle nasıl kullanıldığını açıklayabilir mi diye merak ediyordum.Func'in açıklaması

cevap

123

Are: Burada

onun kullanım örneğidir? delegates and events ile ilgili bir sayfam var, ancak bu ikisi arasındaki farkları açıklamaya yönelik olsa da yardımcı olamaz. o bildiriminde karşılık gelen tip argümanlar ( int ve string) ile tip parametreleri ( T ve TResult) değiştirerek herhangi bir özel durumda ne anlama geldiğini çalışmak -

Func<T, TResult> sadece genel temsilci olduğunu. Func<int, string> bir işlevi bir int argüman alıp bir string dönen temsil eden bir temsilci olduğu, başka deyişle

string ExpandedFunc(int x) 

: Ben de karışıklığı önlemek için yeniden adlandırdık. LINQ'da, hem projeksiyonlar hem de yüklemler için sıklıkla kullanılır (TResult her zaman bool'dur). Örneğin, bir dizi dizgiyi bir dizi diziye yansıtmak için Func<int, string> kullanabilirsiniz. Genellikle alakalı delege oluşturmak için LINQ kullanılanLambda ifadeleri:

Func<int, string> projection = x => "Value=" + x; 
int[] values = { 3, 7, 10 }; 
var strings = values.Select(projection); 

foreach (string s in strings) 
{ 
    Console.WriteLine(s); 
} 

Sonuç:

Value=3 
Value=7 
Value=10 
+2

"Başka bir deyişle, bir bağımsız değişken alarak ve bir dizeyi döndüren bir işlevi temsil eden bir temsilci." Sadece diğerleri için karışıklıktan kaçınmak için Func hakkında konuştuğunuzdan ve Func 'dan bahsetmeyeceğim. Genel türleri ve delegeleri anlıyorsanız, ancak bunu yapmayanlar için, int argümanını alan ve bir dize döndüren bir işleve delege eden Func . –

+0

Daha sonra bir PC'ye döndüğümde açıklığa kavuşacak. –

+8

Downvoters: lütfen nedenleri belirtin ... –

22

Bir parametre olarak bir int alır ve string türünde bir değer döndüren bir temsilci. Genel olarak delege aşina

using System; 

class Program 
{ 
    static void Main() 
    { 
     Func<Int32, String> func = bar; 

     // now I have a delegate which 
     // I can invoke or pass to other 
     // methods. 
     func(1); 
    } 

    static String bar(Int32 value) 
    { 
     return value.ToString(); 
    } 
} 
+0

Teşekkürler andrew. Bar (1) yerine func (1) yazmak mı istediniz? – zSynopsis

+1

Evet yaptım!Düzeltme için teşekkürler! –

33

A Func<int, string> int'leri yiyip dizeleri döndürür. Öyleyse, ne yer ve ne dizeleri döndürür? Bunun hakkında ...

public string IntAsString(int i) 
{ 
    return i.ToString(); 
} 

Burada, yalnızca inox'ları yiyen ve dizeleri döndüren bir işlev yaptım. Nasıl kullanırdım?

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
string str = String.Empty; 

foreach(int i in lst) 
{ 
    str += IntAsString(i); 
} 

// str will be "12345" 

Çok seksi değil, biliyorum, ama bu pek çok hileye dayanan basit bir fikir. Şimdi bir Func kullanalım. Bu fnc adlandırılan (yöntemlere bu referanslar delegates adlandırılır) ve kullanılana bunun yerine Bunun yerine her üyesinde IntAsString çağrı

Func<int, string> fnc = IntAsString; 

foreach (int i in lst) 
{ 
    str += fnc(i); 
} 

// str will be "1234512345" assuming we have same str as before 

, bir referans oluşturulur. (Fnc'nin inft'leri yediğini hatırlar ve dizeleri döndürür).

Bu örnek çok seksi değil, göreceğiniz zeki şeylerden bir tanesi basit bir işlev olan delegeler ve extension methods.

Bu şeylerde gördüğüm en iyi primerlerden biri here. Çok daha gerçekçi örnekleri var. :)

+4

Bu açıklamayı beğendim –

+0

@Therealnapster ben de beğeniyorum ama isminizi daha çok seviyorum. – BKSpurgeon