2010-05-20 24 views
39

का उपयोग रोकें डिफ़ॉल्ट कन्स्ट्रक्टर के उपयोग को रोकने के लिए कोई तरीका है?डिफ़ॉल्ट कन्स्ट्रक्टर

सभी मैं के बारे में सोच सकते हैं एक अपवाद फेंक है, लेकिन मैं कुछ है कि एक संकलन समय त्रुटि होती है चाहते हैं।

+3

आप मुसीबत में पड़ सकता है, यदि आप ऐसा करते हैं: (। बाध्यकारी/क्रमबद्धता/आदि) नेट में सामान्य parameterless निर्माता चीजों की एक संख्या के लिए आवश्यक है। कन्स्ट्रक्टर पैराम्स के माध्यम से सेट करने के लिए आपको जो भी मूल्य चाहिए, उसके लिए डिफ़ॉल्ट होने पर विचार करें। इससे आपके मामले में कोई फर्क नहीं पड़ता है, लेकिन यह उल्लेखनीय है। बिंदु के लिए –

उत्तर

80
  • यदि कक्षा में सब कुछ स्थैतिक है, तो इसे स्थिर वर्ग बनाने पर विचार करें। इस तरह, आपको बिल्कुल एक कन्स्ट्रक्टर नहीं मिलेगा।
  • आप एक parameterless निर्माता चाहते हैं, लेकिन आपके पास उसे सार्वजनिक किया यह स्पष्ट रूप से घोषित करने और इसे निजी बनाने के (या आंतरिक आदि)
  • करने के लिए आप एक parameterless निर्माता लेकिन कंस्ट्रक्टर्स चाहते हो नहीं करना चाहते हैं नहीं करना चाहते हैं मानकों के साथ है, तो बस उन की घोषणा - आप

मैं लगता के लिए है कि सभी ठिकानों को कवर करना चाहिए डिफ़ॉल्ट निर्माता उत्पन्न नहीं किया जाएगा ...

+0

आपने कहा कि मैं बस इतना टाइप कर रहा था :) – Joel

+0

मेरी इच्छा है कि मैं बहुत पहले स्थिर कक्षाओं के बारे में जानता था। – luiscubal

+1

जब तक, यह एक संरचना नहीं है और कक्षा नहीं है। यदि ऐसा है, तो डिफ़ॉल्ट सीटीआर उत्पन्न होता है (एक अच्छी बात यह है कि सभी प्रोप प्रारंभ किए जाते हैं) लेकिन कॉल करने योग्य (दुर्भाग्य से) - यानी मैं उपयोगकर्ता को पैरामीटर के साथ सीटीआर का उपयोग करने के लिए मजबूर करना चाहता हूं। –

35

इसे निजी बनाएं।

तो,

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1। – corsiKa

+9

जब तक आपको इसे टाइप (या नेस्टेड प्रकार) में नहीं चाहिए, तो आप इसे पूरी तरह से यहां हटा सकते हैं - यह केवल तब उत्पन्न होगा जब कोई कन्स्ट्रक्टर स्पष्ट रूप से घोषित नहीं किया जाता है। –

+0

@ जोन मैं आमतौर पर एक बेल्ट और निलंबन करने वाला व्यक्ति हूं इसलिए मैं इसे सामान्य रूप से इस तरह से करता हूं; जिस तरह से मैं करने की कोशिश कर रहा हूं वह इसे देखकर किसी को भी स्पष्ट है। यह जानना अच्छा है कि यह संकलक द्वारा स्वचालित रूप से संभाला जाता है, हालांकि, अगर मैं भूल जाता हूं। –

8

तुम बस यह निजी बना सकते हैं:

private MyClass() 
{ 
} 

वैकल्पिक रूप से (यदि आप पहले नहीं पता था) अगर आप सिर्फ मानकों के साथ एक निर्माता की घोषणा, डिफ़ॉल्ट प्रतिसाद नहीं कंपाइलर द्वारा जोड़ा नहीं है, उदाहरण के लिए

private MyClass(string myParameter) 
{ 
    //Can't call new MyClass() anymore 
} 
5

उल्लेख करने की एक बात यह है कि दूसरों ने नहीं किया है। पुन: उपयोग से बचने के लिए डिफ़ॉल्ट कन्स्ट्रक्टर अभी भी डिफ़ॉल्ट कार्यान्वयन बिट्स सेट करने में सक्षम होना चाहिए। यदि यह निजी है, तो यह कोई समस्या नहीं है, क्योंकि आप अभी भी एक निजी निर्माता के लिए चेन कर सकते हैं। आप इसे बाहरी स्रोतों के लिए अनुपलब्ध बनाते हैं।

private MyClass() 
{ 
} 

public MyClass(string something) : this() 
{ 
} 

कि समस्या का हल। नोट, हालांकि, अगर वर्ग सील नहीं किया गया है तो संरक्षित वास्तव में एक पसंदीदा कार्यान्वयन हो सकता है।

1
अन्य उत्तर के अलावा

, आपको निम्न पाठ पढ़ सकते हैं , सिंगलटन पर अधिक जानकारी के लिए पैटर्न, और कुछ उदाहरण। सिंगलटन पैटर्न निजी होने पर निर्माता पर निर्भर करता है।

http://www.yoda.arachsys.com/csharp/singleton.html

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