C delegeler kullanarak#
Ben burada yeniyim ve ayrıca C yeniyim# Dili ve .NET çerçeve. Anlayış delege ile bana yardım eder misin? Bazı kod kontrol etmeye çalışıyordum ve aldığım sonuçlar benim için beklenmedik olduğunu bulmuşlardır. İşte burada:
class Program
{
public static int I = 0;
static Func<string> del = new Func<string>(I.ToString);
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del());
}
}
Cevap 0 ama 10 oldu. Neden? Teşekkür ederim ve benim kötü İngilizce için üzgünüm.
CEVAP
Sebebi şudur:
Temsilci bildirirken şekilde doğrudan static int örneği ToString
yöntemini gösteriyor. Oluşturma sırasında yakalandı.
Flindeberg aşağıdaki yorum işaret ettiği gibi, her temsilci bir hedef ve hedef üzerinde yürütülecek bir yöntemi vardır.
Bu durumda, idam edilen yöntem açıkçası ToString
yöntemdir. İşin ilginç tarafı ise bu metod uygulanır: Bu örnek I
zaman yaratılması, yani temsilci değil kullanarak I
örneği almak için kullanın ama depolar başvurusu için örnek kendisi.
Daha sonra farklı bir değer I
aslında yeni bir örneğini atama değiştirin. Bu sihirli örneği temsilci yakalanan değiştirmez, neden bunu yapmalıyım?
Beklediğiniz sonucu elde etmek için, bu temsilci değiştirmek gerekir:
static Func<string> del = new Func<string>(() => I.ToString());
Bu gibi, temsilci, temsilci yürütme zaman geçerli I
ToString
yürüten isimsiz bir yöntem gösteriyor.
Bu durumda, idam edilen yöntem olan temsilci olarak bildirilen anonim bir metot oluşturulur. Örnek statik bir yöntem olduğu gibi boş.
Derleyici temsilci ikinci versiyonu için kod oluşturur bir göz atalım:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
Gördüğünüz gibi, normal bir yöntemdirbir şey. Bizim durumumuzda I
geçerli örneği ToString
arama sonucunu verir.
Kullanarak bir tablo sadece 2 sütun de...
Nasıl bir dosya upload Ataç kullanarak...
Nasıl vurgulu jQuery kullanarak toolti...
Alay Statik yöntemler kullanarak Rhino...
SQL update birleşimler kullanarak sorg...