2009-09-01 19 views
41

मेरे पास निम्न कोड है, मैं data2() से data1() पर कॉल करना चाहता हूं। क्या यह सी # में संभव है? यदि हां, तो कैसे?मैं सी # में स्थैतिक विधि से एक गैर स्थैतिक विधि कैसे कॉल करूं?

private void data1() 
{ 
} 
private static void data2() 
{ 
    data1(); //generates error 
} 

उत्तर

88

आपको कक्षा का एक उदाहरण बनाने और उस पर विधि का आह्वान करने की आवश्यकता होगी।

public class Foo 
{ 
    public void Data1() 
    { 
    } 

    public static void Data2() 
    { 
     Foo foo = new Foo(); 
     foo.Data1(); 
    } 
} 
+22

नया फू() डेटा 1(); – abatishchev

+2

क्या होगा यदि यह विधि एएसपी पृष्ठ के भीतर है? मैं वर्तमान में इसके साथ संघर्ष कर रहा हूं। कोई मैन्युअल रूप से एएसपी पेज का उदाहरण नहीं बनाता है। तो मैं एक स्थिर विधि से एएसपी पेज के साथ एक विधि को कॉल करने के बारे में कैसे जाउंगा? (WebMethod) –

+2

@ReidGarwin यह किसी पृष्ठ में कुछ व्यवहार करने में वास्तव में गलत लगता है और इसे कहीं और कहने का प्रयास करता है। शायद इसे किसी अन्य वर्ग में दोबारा प्रतिक्रिया दी जानी चाहिए और आवश्यकता होने पर एक निर्भरता के रूप में एक पृष्ठ उदाहरण लेना चाहिए। हालांकि, ईमानदारी से, यह पूरा पैटर्न चिल्लाता है कि कुछ गड़बड़ है और जब भी संभव हो तो मैं इससे बचूंगा। – tvanfosson

8

आप अपनी मूल कक्षा के उदाहरण के बिना एक गैर स्थैतिक विधि को कॉल नहीं कर सकते हैं।

तो स्थिर विधि से, आप एक नया वस्तु का दृष्टांत करना होगा ...

Vehicle myCar = new Vehicle(); 

... और फिर गैर स्थैतिक विधि कॉल।

myCar.Drive(); 
14

आपको उस विधि का एक स्थिर विधि के भीतर एक उदाहरण बनाना है और फिर इसे कॉल करना है।

इस तरह उदाहरण के लिए:

public class MyClass 
{ 
    private void data1() 
    { 
    } 
    private static void data2() 
    { 
    MyClass c = new MyClass(); 
    c.data1(); 
    } 
} 
23

शायद क्या आप के लिए है देख रहे सिंगलटन पैटर्न?

public class Singleton 
{ 
    private Singleton() {} 

    public void DoWork() 
    { 
     // do something 
    } 

    // You can call this static method which calls the singleton instance method. 
    public static void DoSomeWork() 
    { 
     Instance.DoWork(); 
    } 

    public static Singleton Instance 
    { 
     get { return instance; } 
    } 

    private static Singleton instance = new Singleton(); 
} 

तुम अब भी वर्ग का एक उदाहरण बनाने के लिए है, लेकिन आप यह सुनिश्चित नहीं है केवल एक उदाहरण।

+1

+1 जब मैं अपना प्रश्न – AaronLS

+4

पढ़ता हूं तो बिल्कुल वही बात आती है। सिंगलेट्स अनिवार्य रूप से वैश्विक डेटा होते हैं - वे आपके कोड को परीक्षण करने के लिए कड़ी मेहनत करते हैं (कक्षाएं सिंगलटन के साथ मिलती हैं) और (यदि म्यूटेबल) डीबग करना मुश्किल होती है। जब संभव हो तो उनसे बचें (और अक्सर स्थिर तरीके भी)। यदि आपको आवश्यकता हो तो इसके बजाय डीआई/आईओसी कंटेनर लाइब्रेरी का उपयोग करने पर विचार करें। – TrueWill

5

आपको ऑब्जेक्ट संदर्भ प्रदान करने की आवश्यकता है। कृपया स्थिति में अपना वर्ग नाम प्रदान करें।

private static void data2() 
{ 
    <classname> c1 = new <classname>(); 
    c1. data1(); 
} 
1

यह मानते हुए कि data1() और data2() दोनों एक ही कक्षा में कर रहे हैं, फिर एक और विकल्प data1() स्थिर बनाना है।

private static void data1() 
{ 
} 
private static void data2() 
{ 
    data1(); 
} 
2

बहुत पुराने धागे के लिए उत्तर पोस्ट करने के लिए माफी मांगी लेकिन मेरा मानना ​​है कि मेरा जवाब अन्य की मदद कर सकता है।

प्रतिनिधि की सहायता से वही चीज़ हासिल की जा सकती है।

public class MyClass 
{ 
    private static Action NonStaticDelegate; 

    public void NonStaticMethod() 
    { 
     Console.WriteLine("Non-Static!"); 
    } 

    public static void CaptureDelegate() 
    { 
     MyClass temp = new MyClass(); 
     MyClass.NonStaticDelegate = new Action(temp.NonStaticMethod); 
    } 

    public static void RunNonStaticMethod() 
    { 
     if (MyClass.NonStaticDelegate != null) 
     { 
      // This will run the non-static method. 
      // Note that you still needed to create an instance beforehand 
      MyClass.NonStaticDelegate(); 
     } 
    } 
} 
+0

वाह यह वही है जो मैं ढूंढ रहा था। धन्यवाद! – jonathana

-1

स्टेटिक विधि सीधे गैर-स्थैतिक विधि कॉल की अनुमति नहीं देती है।

कारण: स्टेटिक विधि केवल अपनी कक्षा से संबंधित है, और ऑब्जेक्ट या किसी भी उदाहरण के लिए है।

तो, जब भी आप एक ही कक्षा के अंदर स्थिर विधि से किसी भी गैर स्थैतिक विधि तक पहुँचने का प्रयास: आप प्राप्त करेंगे:

"एक ऑब्जेक्ट संदर्भ गैर स्थिर क्षेत्र, विधि या संपत्ति के लिए आवश्यक है।"

समाधान: आप इस तरह से कॉल विधि का उपयोग कर सकते हैं

public class <classname> 
{ 
static method() 
{ 
    new <classname>.non-static(); 
} 

non-static method() 
{ 

} 


} 
-1

: फू वैसे ही जैसे एक संदर्भ की घोषणा।डेटा 2()

public class Foo 
{ 
    private static Foo _Instance; 

    private Foo() 
    { 
    } 

    public static Foo GetInstance() 
    { 
     if (_Instance == null) 
      _Instance = new Foo(); 
     return _Instance; 
    } 

    protected void Data1() 
    { 
    } 

    public static void Data2() 
    { 
     GetInstance().Data1(); 
    } 
} 
+0

आपके उत्तर में केवल कोड शामिल है, और विवरण जोड़ें – live2

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