Pertanyaan Panggil satu konstruktor dari yang lain


Saya memiliki dua konstruktor yang memberi nilai pada bidang hanya baca.

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;

}

Satu konstruktor menerima nilai secara langsung, dan yang lainnya melakukan beberapa perhitungan dan mendapatkan nilai, kemudian menetapkan bidang.

Sekarang inilah tangkapannya:

  1. Saya tidak ingin menduplikasi pengaturan kode. Dalam hal ini, hanya satu bidang diatur tetapi tentu saja mungkin ada lebih dari satu.
  2. Untuk membuat bidang hanya bisa dibaca, saya perlu untuk mengaturnya dari konstruktor, jadi Saya tidak bisa "mengekstrak" kode yang dibagikan ke fungsi utilitas.
  3. Saya tidak tahu bagaimana cara memanggilnya konstruktor dari yang lain.

Ada ide?


759
2017-10-24 16:06


asal


Jawaban:


Seperti ini:

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

1284
2017-10-24 16:09



Jika apa yang Anda inginkan tidak dapat dicapai secara memuaskan tanpa memiliki inisialisasi dalam metode sendiri (misalnya karena Anda ingin melakukan terlalu banyak sebelum kode inisialisasi, atau membungkusnya dalam percobaan-coba, atau apa pun), Anda dapat memiliki salah satu atau semua Konstruktor melewatkan variabel readonly dengan mengacu pada rutin inisialisasi, yang kemudian akan dapat memanipulasi mereka sesuka hati.

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);
    }
}

131
2017-07-22 20:52



Sebelum badan konstruktor, gunakan salah satu:

: base (parameters)

: this (parameters)

Contoh:

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

48
2017-10-24 16:12



Saya memperbaiki jawaban supercat. Saya kira hal berikut juga bisa dilakukan:

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);
    }
}

8
2017-11-28 13:07



Berikut ini contoh yang memanggil konstruktor lain, lalu memeriksa properti yang telah ditetapkan.

    public SomeClass(int i)
    {
        I = i;
    }

    public SomeClass(SomeOtherClass soc)
        : this(soc.J)
    {
        if (I==0)
        {
            I = DoSomethingHere();
        }
    }

6
2018-05-23 00:17



Ya, Anda dapat memanggil metode lain sebelum call base atau ini!

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

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

}

4
2018-06-07 20:42



Ketika Anda mewarisi kelas dari kelas dasar, Anda dapat memanggil konstruktor kelas dasar dengan instantiate kelas turunan

class sample
{
    public int x;

    public sample(int value)
    {
        x = value;
    }
}

class der : sample
{
    public int a;
    public int b;

    public der(int value1,int value2) : base(50)
    {
        a = value1;
        b = value2;
    }
}

class run 
{
    public static void Main(string[] args)
    {
        der obj = new der(10,20);

        System.Console.WriteLine(obj.x);
        System.Console.WriteLine(obj.a);
        System.Console.WriteLine(obj.b);
    }
}

Output dari program sampel aku s

50 10 20


Anda juga bisa menggunakan this kata kunci untuk memohon konstruktor dari konstruktor lain

class sample
{
    public int x;

    public sample(int value) 
    {
        x = value;
    }

    public sample(sample obj) : this(obj.x) 
    {
    }
}

class run
{
    public static void Main(string[] args) 
    {
        sample s = new sample(20);
        sample ss = new sample(s);

        System.Console.WriteLine(ss.x);
    }
}

Output dari ini program sampel aku s

20


1
2018-03-31 03:52