c# - दूसरे से एक कन्स्ट्रक्टर को कॉल करें




constructor (5)

इस कदर:

public Sample(string str) : this(int.Parse(str)) {
}

मेरे पास दो रचनाकार हैं जो केवल पढ़ने के लिए मूल्यों को फ़ीड करते हैं।

class Sample
{
    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);

        _intField = i;
    }

    public Sample(int theInt)
    {
        _intField = theInt;
    }


    public int IntProperty
    {
        get { return _intField; }
    }
    private readonly int _intField;

}

एक कन्स्ट्रक्टर सीधे मान प्राप्त करता है, और दूसरा कुछ गणना करता है और मान प्राप्त करता है, फिर फ़ील्ड सेट करता है।

अब पकड़ है:

  1. मैं सेटिंग कोड डुप्लिकेट नहीं करना चाहता हूं। इस मामले में, केवल एक फ़ील्ड सेट है लेकिन निश्चित रूप से एक से अधिक हो सकता है।
  2. फ़ील्ड को केवल पढ़ने के लिए, मुझे उन्हें कन्स्ट्रक्टर से सेट करने की आवश्यकता है, इसलिए मैं साझा कोड को एक उपयोगिता फ़ंक्शन में "निकालने" नहीं कर सकता।
  3. मुझे नहीं पता कि एक कन्स्ट्रक्टर को दूसरे से कैसे कॉल करें।

कोई विचार?


कन्स्ट्रक्टर के शरीर से पहले, या तो उपयोग करें:

: base (parameters)

: this (parameters)

उदाहरण:

public class People: User
{
   public People (int EmpID) : base (EmpID)
   {
      // Add more statements here.
   }
}

मैं सुपरकैट के जवाब पर सुधार कर रहा हूं। मुझे लगता है कि निम्नलिखित भी किया जा सकता है:

class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        //Do some stuff here based upon the necessary initialized variables.
        intField = newValue;
    }

    public Sample(string theIntAsString, bool? doStuff = true)
    {
        //Initialization of some necessary variables.
        //==========================================
        int i = int.Parse(theIntAsString);
        // ................
        // .......................
        //==========================================

        if (!doStuff.HasValue || doStuff.Value == true)
           setupStuff(ref _intField,i);
    }

    public Sample(int theInt): this(theInt, false) //"false" param to avoid setupStuff() being called two times
    {
        setupStuff(ref _intField, theInt);
    }
}

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

class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        intField = newValue;
    }

    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);
        setupStuff(ref _intField,i);
    }

    public Sample(int theInt)
    {
        setupStuff(ref _intField, theInt);
    }
}

हाँ, आप कॉल बेस या इससे पहले अन्य विधि को कॉल कर सकते हैं!

public class MyException : Exception
{
    public MyException(int number) : base(ConvertToString(number)) 
    {
    }

    private static string ConvertToString(int number) 
    { 
      return number.toString()
    }

}




constructor