SORU
28 Kasım 2012, ÇARŞAMBA


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
28 Kasım 2012, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DrakeVEVO

    DrakeVEVO

    17 AĞUSTOS 2009
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006
  • TeeMayneTV

    TeeMayneTV

    27 Kasım 2010