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

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

    public Sample(int theInt) => _intField = theInt;
    public int IntProperty    => _intField;

    private readonly int _intField;
}

一个构造函数直接接收值,另一个构造函数进行一些计算并获得值,然后设置字段。

现在问题来了:

我不想复制 设置代码。在这种情况下,只有一个 场地已经设置好了,当然还有可能 要大于1。 要使字段为只读,我需要 从构造函数中设置它们,那么 我不能将共享代码“提取”到 效用函数。 我不知道怎么叫 另一个构造函数。

什么好主意吗?


当前回答

构造函数链接,即你可以使用“Base”是一个关系,“This”你可以使用同一个类,当你想在一个调用中调用多个构造函数。

  class BaseClass
{
    public BaseClass():this(10)
    {
    }
    public BaseClass(int val)
    {
    }
}
    class Program
    {
        static void Main(string[] args)
        {
            new BaseClass();
            ReadLine();
        }
    }

其他回答

注意:上面的大多数解决方案都不适用于结构体。

不幸的是,在构造函数调用的方法中初始化struct字段不会被编译器识别,并将导致2个错误:

字段xxxx必须被完全赋值… 在方法中,如果你有只读字段:只读字段不能被赋值,除非在构造函数中。

例如,当你只需要做一些简单的检查来决定调用指向哪个构造函数时,这真的很令人沮丧。

拜托,拜托,亲爱的千万不要在家里,或者在工作场所,或者任何地方尝试这个。

这是解决一个非常非常具体的问题的方法,我希望你们不会遇到这种情况。

我发布这篇文章,因为从技术上讲,这是一个答案,也是另一个看待它的角度。

重复一遍,任何情况下都不要使用。代码是与LINQPad运行。

void Main()
{
    (new A(1)).Dump();
    (new B(2, -1)).Dump();
    
    var b2 = new B(2, -1);
    b2.Increment();
    
    b2.Dump();
}

class A 
{
    public readonly int I = 0;
    
    public A(int i)
    {
        I = i;
    }
}

class B: A
{
    public int J;
    public B(int i, int j): base(i)
    {
        J = j;
    }
    
    public B(int i, bool wtf): base(i)
    {
    }
    
    public void Increment()
    {
        int i = I + 1;

        var t = typeof(B).BaseType;
        var ctor = t.GetConstructors().First();
        
        ctor.Invoke(this, new object[] { i });
    }
}

因为构造函数是一个方法,你可以用反射来调用它。现在您可以用传送门来思考,或者想象一罐蠕虫的图片。很抱歉。

是的,你可以在call base或this之前调用其他方法!

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

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

}

下面是一个调用另一个构造函数的例子,然后检查它所设置的属性。

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

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

在构造函数体之前,使用以下任意一个:

: base (parameters)

: this (parameters)

例子:

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