C# 从参数化构造函数调用默认构造函数

C# 从参数化构造函数调用默认构造函数,c#,constructor,constructor-chaining,C#,Constructor,Constructor Chaining,我希望我的默认构造函数创建并初始化代码段中显示的所有对象。然后,我希望我的参数化构造函数调用默认构造函数,从而创建和初始化这些对象,然后这些对象可以在参数化构造函数中使用,而不会得到NullReferenceException 在这种情况下,我不确定使用构造函数的最佳方式(最有效、代码更少等等)是什么。我更喜欢使用构造函数链接 同样,我对构造函数有一个非常基本的了解,所以如果这是不可能的,那么请告诉我,并告诉我在这种情况下你会怎么做 class Rectangle { public Li

我希望我的默认构造函数创建并初始化代码段中显示的所有对象。然后,我希望我的参数化构造函数调用默认构造函数,从而创建和初始化这些对象,然后这些对象可以在参数化构造函数中使用,而不会得到NullReferenceException

在这种情况下,我不确定使用构造函数的最佳方式(最有效、代码更少等等)是什么。我更喜欢使用构造函数链接

同样,我对构造函数有一个非常基本的了解,所以如果这是不可能的,那么请告诉我,并告诉我在这种情况下你会怎么做

class Rectangle
{
    public Line left { get; set; }
    public Line top { get; set; }
    public Line right { get; set; }
    public Line bottom { get; set; }

    public Rectangle() : this(new Line()) { }

    public Rectangle(Line diagnonal) 
    {
        left = new Line();
        top = new Line();
        right = new Line();
        bottom = new Line();

        Point beginningDiagonalPoint = new Point();
        Point endingDiagonalPoint = new Point();

        beginningDiagonalPoint = diagnonal.startPoint;
        endingDiagonalPoint = diagnonal.endPoint;

        int begXC = beginningDiagonalPoint.xCoord;
        int begYC = beginningDiagonalPoint.yCoord;

        int endXC = endingDiagonalPoint.xCoord;
        int endYC = endingDiagonalPoint.yCoord;

        Point rightSideEnd = new Point();

        rightSideEnd.xCoord = endXC;
        rightSideEnd.yCoord = begYC;

        Point leftSideEnd = new Point();

        leftSideEnd.xCoord = begXC;
        leftSideEnd.yCoord = endYC;

        // ----------- right side definitions -------------
        right.startPoint = endingDiagonalPoint;
        right.endPoint = rightSideEnd;

        // ------------ left side definitions --------------
        left.startPoint = beginningDiagonalPoint;
        left.endPoint = leftSideEnd;

        // ------------ top side definitions -------------
        top.startPoint = leftSideEnd;
        top.endPoint = endingDiagonalPoint;

        // ------------ bottom side definitions -----------
        bottom.startPoint = rightSideEnd;
        bottom.endPoint = beginningDiagonalPoint;
    }
}

你的例子几乎满足了你的要求。但是,按照您的方式,调用参数化构造函数的是默认构造函数,为其提供了一个默认参数。这样做没什么错,只是你说的不是你想要的


此外,公共财产通常以大写字母开头(
,而不是
)。请注意,所有.NET库类都是这样做的。

您的参数化构造函数已经初始化了所有属性。所以,我认为您需要做的就是从默认构造函数向参数化构造函数传递某种默认值

您需要自己回答这个问题:什么是默认矩形或空矩形?我假设它是零号的

假设直线以两点为参数,我会这样做:

public Rectangle() : this(new Line(new Point(0,0), new Point(0,0))) { }
并以较少压缩的格式:

public Rectangle() 
    : this(
          new Line(
              new Point(0,0), 
              new Point(0,0)
          )
      ) 
{ }

通常,当您链接构造函数时,情况正好相反:默认构造函数使用默认值调用更具体的构造函数。比如说,你有一个点构造器,它接受x和y坐标。然后让默认的点构造函数调用另一个x=0和y=0的点构造函数。这样,您只需编写代码来设置一次值

以下是您可以在代码中改进的一些内容:

  • 起始对角线点
    结束对角线点
    初始化为新点,然后使用对
    对角线起点
    对角线终点
    的引用覆盖它们。您将创建两个新点,然后丢弃它们。您不需要创建这些新点

  • 使用默认构造函数创建新点和新线,然后手动设置其字段。您可以创建一个接收两个坐标并设置它们的点构造函数,以及一个接收两个端点并设置它们的线构造函数。您的代码如下所示:

     Point rightSideEnd = new Point(endXC, begYC);
     Point leftSideEnd = new Point(begXC, endYC);
    
     right = new Line(endingDiagonalPoint, rightSideEnd);
     left = new Line(beginningDiagonalPoint, leftSideEnd);
     top = new Line(leftSideEnd, endingDiagonalPoint);
     bottom = new Line(rightSideEnd, beginningDiagonalPoint);
    
  • 我刚才补充说

    : this()
    

    在参数化构造函数之后。这是一个猜测,但似乎是可行的。

    这只是一个遗憾,它似乎在执行自定义构造函数中的任何代码之前调用了基构造函数,而不是调用它的基构造函数,因为使用
    :base()
    不会调用无参数构造函数(这个类的-如果继承,它将调用基类的构造函数)。是的,这是预期的行为-如果这不是您想要的,那么您的初始化不正确。