2012-08-28 8 views
8

बहुत आम परिदृश्य: मेरे पास एक से अधिक आवृत्ति चर और एक कन्स्ट्रक्टर है जो एकाधिक पैरामीटर स्वीकार करता है। क्या मैं किसी एक को दूसरे से बांध सकता हूं? आवृत्ति चर के लिए सभी पैरामीटर असाइन करना बहुत वर्बोज़ है और यह उन परिस्थितियों में से एक है जो सम्मेलन-ओवर-कॉन्फ़िगरेशन सिद्धांत द्वारा कवर (और होना चाहिए) हो सकता है। मेरे उदाहरण कोड इस तरह दिखता है:सी # बाइंड कन्स्ट्रक्टर पैरामीटर उदाहरण चर के लिए

public class myClass 
{  
    private object param1; 
    private object param2; 
    private object param3; 
    private object param4; 

    public myClass(object param1, object param2, object param3, object param4) 
    { 
     this.param1 = param1; 
     this.param2 = param2; 
     this.param3 = param3; 
     this.param4 = param4; 
    } 
} 

वहाँ एक आसान तरीका यह से छुटकारा पाने और अपना जादू स्वचालित रूप से जाने सी # करते है?

+3

प्लगइन्स CodeRush की तरह: आप उस पर क्लिक करें, या ALT+SHIFT+F10 प्रेस (डिफ़ॉल्ट रूप से) यदि इस प्रकार आप एक मेनू, विकल्प एक ठूंठ निर्माता उत्पन्न करने के लिए है, जिस पर से एक है, जो तब MyClass कोड बदल जाएगा मिल या जस्टकोड स्वचालित रूप से आपके लिए उस कोड को उत्पन्न कर सकता है। – sloth

+0

आप कोड स्निपेट का उपयोग करने पर भी देख सकते हैं: http://msdn.microsoft.com/en-us/library/ms165392(v=vs.80).aspx हालांकि, BigYellowCactus द्वारा उल्लिखित टूल आपको बेहतर उत्पादकता देंगे । –

+2

उपरोक्त सूची में Resharper जोड़ें। –

उत्तर

2

हालांकि ऐसे कई प्लगइन्स हैं जो इस तरह की चीज कर सकते हैं - यह ध्यान देने योग्य है कि यदि आप मिलान करने वाले कन्स्ट्रक्टर मौजूद नहीं होने पर मॉडल कॉल से कन्स्ट्रक्टर जेनरेट करने की मूल क्षमता रखते हैं, तो आप एक सरल कीबोर्ड शॉर्टकट का उपयोग कर सकते हैं आपके लिए काम

आईई। अगर मैं एक ठूंठ वर्ग:

class MyClass{ 

} 

और फिर एक विधि में कहीं मैं कुछ इस तरह लिखना:

object p1, p2, p3; 
//... (get values for p1-3) 
var a = new MyClass(p1, p2, p3); 

जब इस तरह के एक निर्माता मौजूद नहीं है, एक छोटे से सहायक बटन प्रकट होता है।

class MyClass 
{ 
    private object p1; 
    private object p2; 
    private object p3; 

    public MyClass(object p1, object p2, object p3) 
    { 
     // TODO: Complete member initialization 
     this.p1 = p1; 
     this.p2 = p2; 
     this.p3 = p3; 
    } 

} 
+2

+1: आप उसी मेनू तक पहुंचने के लिए 'ctrl' +' .' का उपयोग भी कर सकते हैं (कम से कम VS2010 एक्सप्रेस में)। –

+0

कूल - यह तीन-कुंजी संस्करण की तुलना में काफी आसान है! –

+0

वास्तव में अच्छा है। बहुत बहुत धन्यवाद। 100% जो मैं उम्मीद कर रहा था, लेकिन जैसा कि दान ने इंगित किया था, मैं भी अपनी वर्तमान स्थिति पर केंद्रित था और कई प्रासंगिक पहलुओं पर विचार नहीं किया। तो मुझे लगता है कि Ctrl +। यह है :) – Jan

5

सी # भाषा के भीतर कुछ भी नहीं है जो इसे कवर करता है, नहीं। जबकि उपकरण आपके लिए कोड उत्पन्न कर सकते हैं, वे आवश्यक रूप से इसे अद्यतित नहीं रख सकते हैं और आप अभी भी मौजूद कोड और दृश्य के साथ समाप्त हो जाएंगे। आप संभावितसकता है प्रतिबिंब का उपयोग कर कुछ परिस्थितियों में यह करते हैं, उदाहरण के लिए:

public MyClass(object param1, object param2, object param3, object param4) 
{ 
    Helpers.PopulateFromConstructor(this, param1, param2, param3, param4); 
} 

... जहां पैरामीटर के रूप में एक ही क्रम में मान निर्दिष्ट, और जैसा कि नाम ही रखने की जरूरत होगी फ़ील्ड इत्यादि। आप यह भी पा सकते हैं कि फ़ील्ड readonly हैं।

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

ध्यान दें कि आप फ़ील्ड सेट करते समय प्रमाणीकरण करना चाहते हैं, खासकर शून्यता के आसपास। तो अपने निर्माता शरीर हो सकता है इस तरह वास्तव में अंत तक:

public myClass(object param1, object param2, object param3, object param4) 
{ 
    this.param1 = Preconditions.CheckNotNull(param1); 
    this.param2 = param2; 
    this.param3 = Preconditions.CheckNotNull(param3); 
    this.param4 = param4; 
} 

(एक उपयुक्त Preconditions कक्षा के लिए, निश्चित रूप से मैं अनावश्यक रूप से जावा कोड में अमरूद से विचार, nicked गया है के रूप में मैं दिन में का उपयोग करें। के लिए दिन कोडिंग। यह दृष्टिकोण हम Noda Time में भी इस्तेमाल करते हैं।)

+0

+1 "इसे चूसना" के लिए +1 – hmqcnoesy

4

"... (और जा सकती है) सम्मेलन-ओवर-विन्यास सिद्धांत के अंतर्गत आने वाले चाहिए किया जा सकता है ..."

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

हालांकि, यह प्रोग्रामिंग भाषा के बारे में सच नहीं है। भाषा व्यापक, और निम्न स्तर, और तुलनात्मक द्वारा जटिल है। इसे अपने उपयोगकर्ता को भाषा के मूल्य को कम किए बिना जितना संभव हो उतना सीमित करना चाहिए। इस तरह के एक व्यापक "सम्मेलन" मानना ​​बहुत अनुवादात्मक होगा। इसके अलावा, यह संकलक के खतरनाक होगा कि किसी दिए गए नाम के साथ पैरामीटर हमेशा समान नाम के एक निजी क्षेत्र में असाइन किया जाना चाहिए।

एक के लिए, आपका सम्मेलन केवल सामान्य रूप से उपयोग नहीं किया जाता है। उदाहरण के लिए, एक सामान्य कोडिंग शैलियों अंडरस्कोर के नेतृत्व वाले निजी क्षेत्रों (_param1) का सुझाव देती है, जो आपका सम्मेलन याद आती है। कन्स्ट्रक्टर के पास केवल उन असाइनमेंट से परे तर्क हो सकता है, इस मामले में आपका सम्मेलन बहुत आसान है: क्या "कन्वेंशन-संचालित" कोड किसी अन्य कन्स्ट्रक्टर तर्क से पहले या उसके बाद निष्पादित किया जाना चाहिए?

सबसे महत्वपूर्ण बात यह है कि इस तरह के एक सम्मेलन को कैसे ओवरराइड किया जाएगा? यदि, कन्स्ट्रक्टर में, आप किसी अन्य तरीके से param1 का उपभोग करना चाहते थे, तो क्या आप अभी भी सम्मेलन निष्पादित करते हैं?क्या होगा यदि, कन्स्ट्रक्टर में, मैं this.param1 पर एक अलग मान निर्दिष्ट करता हूं? क्या आपका सम्मेलन उस कोड के पहले या उसके बाद होता है जिसे उपयोगकर्ता ने जोड़ा है?

यहां तक ​​कि इन संक्षिप्त प्रश्नों - जिसके लिए बहुत से लोगों के पास बहुत अलग और समान रूप से वैध उत्तर होंगे - यह सुझाव देने के लिए पर्याप्त हैं कि ऐसा सम्मेलन उतना स्पष्ट नहीं है, न ही आसानी से परिभाषित किया जा सकता है।

+0

वाह, बहुत सारे अच्छे अंक। मुझे लगता है कि मैं जो खोज रहा हूं वह "मेरे जीवन को आसान बनाने" की लड़ाई में एक और अध्याय है, "मेरे जीवन को लचीला रखें"। मुझे लगता है कि एंड्रेस का जवाब यह करने का सबसे अच्छा/आसान अभी तक का सबसे लचीला तरीका है। – Jan

+0

और उन परिस्थितियों में से एक जहां मैं 2 उत्तरों स्वीकार करना पसंद करूंगा! – Jan

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