2010-02-19 14 views
5

सी # में प्रतिनिधियों का उपयोग करते समय एक फ़ंक्शन स्टेटिक बनाना आवश्यक क्यों है?एक स्थिर विधि में उपयोग किए जाने पर एक प्रतिनिधि गैर-स्थैतिक विधि का संदर्भ क्यों नहीं दे सकता है?

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

क्योंकि आप इसे मुख्य से एक स्थिर संदर्भ में संदर्भित करने का प्रयास कर रहे हैं? – captncraig

+2

मैं प्रश्न के आधार पर इनकार करता हूं; विधि को स्थिर बनाने के लिए * आवश्यक नहीं है। विधि को सफलतापूर्वक कॉल करने के लिए प्रतिनिधि को पर्याप्त जानकारी प्रदान करना आवश्यक है; गैर स्थैतिक तरीकों के लिए, जिसमें गैर-स्थैतिक विधि कॉल प्राप्त करने वाला उदाहरण प्रदान करना शामिल है। –

उत्तर

11

यह "आवश्यक" नहीं है। लेकिन आपकी मुख्य विधि static है, इसलिए यह गैर-static विधि को कॉल नहीं कर सकता है। कुछ इस तरह का प्रयास करें (यह वास्तव में बातें-क्या तुम सच में एक नया वर्ग बनाना चाहिए करने के लिए एक अच्छा तरीका नहीं है, लेकिन यह अपने नमूना ज्यादा परिवर्तन नहीं करता है):

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

अच्छा काम कोड के साथ अपने दावे को अस्वीकार कर रहा है। स्पष्ट रूप से मुख्य (एक स्थैतिक विधि) इसे कॉल करके निष्पादित (एक उदाहरण विधि) को संदर्भित करता है। सही कथन "एक विधि विधि के संदर्भ में एक स्थिर विधि या किसी अन्य वर्ग की विधि के लिए होगा, ऐसा करने पर इसे उदाहरण प्रदान करना होगा"। एक ही कक्षा के भीतर इंस्टेंस विधियों को एक उदाहरण विधि का जिक्र करते समय भी एक उदाहरण प्रदान करना होगा (इसे देखने के लिए आईएल देखें), लेकिन सी # कंपाइलर "इस" पर डिफ़ॉल्ट है, आप एक निर्दिष्ट नहीं करते हैं। –

8

आपका समारोह क्योंकि स्थिर होने की जरूरत है आप एक स्थिर विधि से कॉल कर रहे हैं, मुख्य। आप विधि गैर स्थिर बना सकते हैं:,

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

आप यह कर सकते हैं। आपको क्या करना चाहिए इसका एक बड़ा सवाल है। :) – pdr

+2

@pdr: ?? सवाल यह है कि विधि स्थिर होना क्यों है। मेरा जवाब यह है कि यह होना आवश्यक नहीं है, और इसे प्रदर्शित करता है। – Amy

1

इस मामले में क्योंकि आप किसी भी वर्ग का उदाहरण बनाकर नहीं कर रहे हैं, एकमात्र विकल्प एक स्थिर कार्य है। क्या आप किसी प्रकार के प्रोग्राम को ऑब्जेक्ट को चालू करने के लिए थे, तो आप इसके बजाय एक इंस्टेंस विधि का उपयोग कर सकते थे।

1

प्रतिनिधि मूल रूप से विधियों के समान नियमों का पालन करते हैं। उदाहरण में प्रदान किया गया है कि आपका प्रतिनिधि स्थिर होना चाहिए क्योंकि आप इसे एक स्थिर विधि से बुला रहे हैं। उसी तरह से इस काम करेंगे नहीं:

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; 
} 

लेकिन यदि आप इस तरह एक गैर स्थिर संदर्भ में बातें ले जाया गया:

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; 
    } 
} 

आप एक गैर स्थैतिक विधि के साथ एक प्रतिनिधि हो सकता है।

+0

यह सच नहीं है कि आप स्थिर संदर्भ से एक गैर स्थैतिक विधि में प्रतिनिधि हो सकते हैं। जैसे MyDelegate del = foo.Bar; मान्य है भले ही बार स्थिर नहीं है और असाइनमेंट एक स्थिर संदर्भ में है। –

संबंधित मुद्दे