2013-02-14 61 views
22

में परिवर्तित नहीं कर सकता है मेरे पास Pin नामक एक कक्षा है।सी # विधि को गैर प्रतिनिधि प्रकार

public class Pin 
{ 
    private string title; 

    public Pin() { } 

    public setTitle(string title) { 
     this.title = title; 
    } 
    public String getTitle() 
    { 
     return title; 
    } 
} 

अन्य वर्ग से मैं एक List<Pin> पिंस में पिंस वस्तुओं को जोड़ने और एक अन्य से मैं सूची पिन पुनरावृति और तत्वों प्राप्त करना चाहते हैं। तो मेरे पास यह कोड है।

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.getTitle; 
} 

इस कोड के साथ मैं शीर्षक पुनर्प्राप्त नहीं कर सकता। क्यूं कर?

: यह एक संदर्भ या delegate एक विधि रिटर्न (

+0

क्योंकि आपको इसे कॉल करने की आवश्यकता है, उदाहरण के लिए 'obj.getTitle() ' – leppie

+0

क्या आपने गुगल खोज करने की कोशिश की है? यह एक आम आम शुरुआत की त्रुटि है। – antonijn

+0

विषय से थोड़ा दूर, लेकिन लेखन सेटर्स और गेटर्स का विरोध करने के लिए गुण पेश किए गए थे। अधिक जानकारी के लिए: http://msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx – Matthew

उत्तर

43

आप एक विधि कॉल के बाद कोष्ठकों जोड़ने की जरूरत है, और संकलक आप के बारे में बात कर रहे हैं सोचेंगे विधि स्वयं (एक प्रतिनिधि प्रकार), जबकि आप वास्तव में उस विधि के वापसी मूल्य के बारे में बात कर रहे हैं।

string t = obj.getTitle(); 

अतिरिक्त गैर-आवश्यक सूचना

इसके अलावा, गुण पर एक नजर है। इस तरह आप शीर्षक का उपयोग कर सकते हैं जैसे कि यह एक चर था, जबकि आंतरिक रूप से, यह एक समारोह की तरह काम करता है। इस तरह आप कार्यों getTitle() और setTitle(string value) लिखने के लिए नहीं है, लेकिन आप इसे इस तरह से कर सकता है:

public string Title // Note: public fields, methods and properties use PascalCasing 
{ 
    get // This replaces your getTitle method 
    { 
     return _title; // Where _title is a field somewhere 
    } 
    set // And this replaces your setTitle method 
    { 
     _title = value; // value behaves like a method parameter 
    } 
} 

या आप स्वत: लागू किया गुण इस्तेमाल कर सकते हैं, जो डिफ़ॉल्ट रूप से इस का प्रयोग करेंगे:

public string Title { get; set; } 

और आपको अपना बैकिंग फ़ील्ड (_title) बनाना नहीं होगा, संकलक इसे स्वयं बना देगा।

public string Title { get; private set; } 

आप गुणों का उपयोग के रूप में यदि वे खेतों थे, यानी:

this.Title = "Example"; 
string local = this.Title; 
+3

ओह मेरे भगवान ... यह एक बचपन की गलती थी! – gts13

3

क्योंकि getTitle एक string नहीं है (ध्यान दें ClassListPin सिर्फ एक स्थिर वर्ग जो कुछ तत्वों और इनमें से एक होता है, List<Pin> पिन है), यदि आप जैसे), यदि आप स्पष्ट रूप से विधि को कॉल नहीं करते हैं।

अपने विधि इस तरह से कॉल करें:

string t= obj.getTitle() ; //obj.getTitle() says return the title string object 

बहरहाल, यह काम करेगा:

Func<string> method = obj.getTitle; // this compiles to a delegate and points to the method 

string s = method();//call the delegate or using this syntax `method.Invoke();` 
2

एक विधि पर अमल करने के लिए आप

इसके अलावा, आप संपत्ति accessors (getters और setters) के लिए पहुँच स्तर को बदल सकते हैं कोष्ठक जोड़ने की आवश्यकता है, भले ही विधि तर्क नहीं लेती है।

तो यह होना चाहिए:

string t = obj.getTitle(); 
6

getTitle एक समारोह है, तो आप इसे बाद () डाल करने के लिए की जरूरत है।

string t = obj.getTitle(); 
5

जैसा कि बताया जा आप, obj.getTile()

उपयोग करने की आवश्यकता लेकिन इस मामले मुझे लगता है कि आप एक Property का उपयोग करने के लिए देख रहे हैं में।

public class Pin 
{ 
    private string title; 

    public Pin() { } 

    public setTitle(string title) { 
     this.title = title; 
    } 

    public String Title 
    { 
     get { return title; } 
    } 
} 

इस रूप में @Antonijn कहा आप

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.Title; 
} 
+0

तब 'शीर्षक' होना चाहिए, न कि 'getTitle'। – antonijn

+0

मेरा बुरा, तय। :) – eandersson

6

का उपयोग करने की अनुमति देगा, आप की जरूरत getTitle विधि पर अमल बताया कोष्ठकों द्वारा:

string t = obj.getTitle(); 

लेकिन मैं जोड़ना चाहते हैं , कि आप सी # में जावा प्रोग्रामिंग कर रहे हैं। वहाँ properties (हो और सेट तरीकों की जोड़ी) है, जो ऐसे मामलों में इस्तेमाल किया जाना चाहिए की अवधारणा है:

public class Pin 
{ 
    private string _title; 

    // you don't need to define empty constructor 
    // public Pin() { } 

    public string Title 
    { 
     get { return _title; } 
     set { _title = value; } 
    } 
} 

और भी अधिक, इस मामले में आप संकलक पूछ सकते हैं न केवल के लिए मिलता है और तरीकों पीढ़ी सेट है, लेकिन भी वापस भंडारण पीढ़ी के लिए, auto-impelemented property उपयोग के माध्यम से:

public class Pin 
{ 
    public string Title { get; set; } 
} 

और अब आप विधि पर अमल की जरूरत नहीं है, क्योंकि गुण क्षेत्रों की तरह इस्तेमाल किया:

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.Title; 
} 
4

आप नीचे दिए गए अपने क्लास कोड को सरल बना सकते हैं और यह काम करेगा, लेकिन यदि आप अपना उदाहरण काम करना चाहते हैं, तो अंत में कोष्ठक जोड़ें: स्ट्रिंग x = getTitle();

public class Pin 
{ 
    public string Title { get; set;} 
}