[c#] 从另一个调用一个构造函数



Answers

如果你不想在自己的方法中进行初始化(例如,因为你想在初始化代码之前做太多的事情,或者试着包装它,或者其他任何东西),你不能满意地实现你想要的东西,你可以拥有任何或所有的东西构造函数通过引用初始化例程来传递只读变量,然后可以随意操作它们。

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

我有两个构造函数将值提供给只读字段。

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. 我不知道如何从另一个构造函数中调用一个构造函数。

有任何想法吗?




是的,你可以在呼叫基地或这个之前打电话给其他方法!

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

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

}



我正在改进supercat的答案。 我猜也可以做到以下几点:

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



Related