Birisinin ne Func<int, string>
olduğunu ve nasıl kullanıldığını bazı net örneklerle açıklayıp açıklayamayacağını merak ediyordum .
Yanıtlar:
Genel olarak delegelere aşina mısınız? Temsilciler ve olaylar hakkında , olmasa da yardımcı olabilecek bir sayfam var , ancak daha çok ikisi arasındaki farkları açıklamaya yönelik.
Func<T, TResult>
sadece genel bir temsilcidir - herhangi bir özel durumda, tür parametrelerini ( T
ve TResult
) bildirimdeki karşılık gelen tür argümanlarıyla ( int
ve string
) değiştirerek bunun ne anlama geldiğini hesaplayın. Karışıklığı önlemek için de adını değiştirdim:
string ExpandedFunc(int x)
Başka bir deyişle, Func<int, string>
bir int
bağımsız değişken alan ve a döndüren bir işlevi temsil eden bir temsilcidir string
.
Func<T, TResult>
LINQ'da hem tahminler hem de tahminler için sıklıkla kullanılır (ikinci durumda TResult
her zaman kullanılır bool
). Örneğin, Func<int, string>
bir tamsayı dizisini bir dizge dizisine yansıtmak için a kullanabilirsiniz . Lambda ifadeleri genellikle LINQ'de ilgili temsilcileri oluşturmak için kullanılır:
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
A Func<int, string>
girişleri yer ve dizeleri döndürür. Öyleyse, ints'i yer ve dizeleri döndüren nedir? Buna ne dersin ...
public string IntAsString( int i )
{
return i.ToString();
}
Orada, ints yiyen ve dizeleri döndüren bir işlev oluşturdum. Nasıl kullanırı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 birçok numaranın dayandığı basit fikir bu. Şimdi bunun yerine bir Func kullanalım.
Func<int, string> fnc = IntAsString;
foreach (int i in lst)
{
str += fnc(i);
}
// str will be "1234512345" assuming we have same str as before
Her üyede IntAsString'i çağırmak yerine, ona fnc adında bir referans oluşturdum (yöntemlere yapılan bu referanslara delegeler denir ) ve onu kullandım. (Unutmayın fnc girişleri yedi ve dizeler döndürür).
Bu örnek çok seksi değil, ancak göreceğiniz bir sürü zekice şey, işlevler, delegeler ve uzatma yöntemlerinin basit fikrine dayanıyor .
Bu şeyde gördüğüm en iyi primerlerden biri burada . Çok daha gerçek örnekleri var. :)
Birini int
parametre olarak alan ve bir tür değeri döndüren bir temsilcidir string
.
İşte kullanımına bir örnek:
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();
}
}
Func<int, string>
int değer parametresini kabul eder ve bir dize değeri döndürür. Ek bir destekleme yönteminin gereksiz olduğu bir örneği burada bulabilirsiniz.
Func<int, string> GetDogMessage = dogAge =>
{
if (dogAge < 3) return "You have a puppy!";
if (dogAge < 7) return "Strong adult dog!";
return "Age is catching up with the dog!";
};
string youngDogMessage = GetDogMessage(2);
NOT: Func'daki son nesne türü (yani bu örnekte "dize"), işlevlerin dönüş türüdür (yani ilkellerle sınırlı değildir, ancak herhangi bir nesneyle). Bu nedenle, Func<int, bool, float>
int ve bool değer parametrelerini kabul eder ve bir float değeri döndürür.
Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
{
if(intValue > 100 && boolValue) return 100;
return 1;
};
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);
HTH