2010-02-19 17 views
5

C# 'da delegeleri kullanırken bir işlev STATIC yapmak neden gereklidir?Statik bir yöntemde kullanıldığında temsilci neden statik olmayan bir yönteme başvurmuyor?

class Program 
{ 
    delegate int Fun (int a, int b); 
    static void Main(string[] args) 
    { 
     Fun F1 = new Fun(Add); 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

    **static public int Add(int a, int b)** 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 
+0

Bunu Main'dan statik bir bağlamda göndermeye çalışıyorsunuz? – captncraig

+2

Sorunun önermesini inkar ediyorum; yöntemi statik yapmak için * gerekli değildir. Yöntemi başarıyla çağırmak için temsilci için yeterli bilgi sağlamak gerekir; Statik olmayan yöntemler için, statik olmayan yöntem çağrısı alma örneğini sağlama içerir. –

cevap

11

Bu "gerekli" değil. Ancak, Ana yönteminiz static yöntemidir, bu nedenle static yöntemini kullanamaz. (Bu gerçekten şeyler-Eğer gerçekten yeni bir sınıf oluşturmak gerekir yapmak için iyi bir yol değildir, ancak kadarını örnek değişmez) Böyle bir şey deneyin:

class Program 
{ 
    delegate int Fun (int a, int b); 
    void Execute() 
    { 
     Fun F1 = new Fun(Add); 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

    static void Main(string[] args) 
    { 
     var program = new Program(); 
     program.Execute(); 
    } 

    int Add(int a, int b) 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 
+1

İyi bir iş kendi isteğinizi kod ile onaylamıyor. Açıkça Ana (statik bir yöntem), onu çağırarak Execute (bir örnek yöntemi) anlamına gelir. Doğru deyim "Bir örnek yöntemine başvurmak için başka bir sınıfın statik yöntemi veya yöntemi için, bu örnekte bunu sağlaması gerekir" olur. Aynı sınıftaki örnek yöntemleri, bir örnek yöntemine başvururken bir örnek de sağlamalıdır (bunu görmek için IL'yi denetleyin), ancak C# derleyicisi varsayılan olarak "bu" değerini belirtmezsiniz. –

8

İşleviniz çünkü statik olması gerekir Statik bir yöntemden arıyorsun, Main. Sen yöntem olmayan statik yapabilirsiniz: Herhangi bir sınıfın bir örneğini oluşturarak değil, çünkü bu durumda

class Program 
{ 
    delegate int Fun (int a, int b); 
    static void Main(string[] args) 
    { 
     Program p = new Program();  // create instance of Program 
     Fun F1 = new Fun(p.Add);   // now your non-static method can be referenced 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

    public int Add(int a, int b) 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 
+0

Bunu yapabilirsiniz. Yapman gerekip gerekmediğine dair büyük bir soru var. :) – pdr

+2

@ pdr: ?? Soru, yöntemin neden statik olması gerektiğidir. Cevabım, olması gerekmiyor ve bunu göstermesi. – Amy

1

, tek alternatif statik fonksiyonudur. Program türünde bir nesneyi örneklendirdiyseniz, bunun yerine bir örnek yöntemi kullanabilirsiniz.

1

Temsilciler, temel olarak yöntemlerle aynı kuralları izler. Sağlanan örnekte, temsilci statik bir yöntemden çağırdığınız için statik olmalıdır. Aynı şekilde bu işe yaramaz:

static void Main(string[] args) 
{ 
    int Res = Add(3, 4); 
    Console.WriteLine(Res); 
} 

public int Add(int a, int b) 
{ 
    int result; 
    result = a + b; 
    return result; 
} 

Böyle olmayan bir statik bağlam içine şeyler taşındı Ancak eğer:

class MyClass 
{ 
    public MyClass() 
    { 
     Fun F1 = new Fun(Add); 
     int Res = F1(2, 3); 
     Console.WriteLine(Res); 
    } 

    public int Add(int a, int b) 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 

olmayan bir statik yöntemi ile bir temsilci olabilir.

+0

Bu, statik olmayan bir yöntemden statik bir bağlamdan temsilci atayabileceğiniz doğru değildir. Örneğin. MyDelegate del = foo.Bar; Bar statik değil ve ödev statik bir bağlamda olsa bile geçerlidir. –

İlgili konular