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

Ale*_*lex 3 c# constructor constructor-chaining

我希望我的默认构造函数能够创建和初始化我的代码片段中显示的所有对象.然后我希望我的参数化构造函数调用默认构造函数,从而创建并初始化这些对象,然后可以在参数化构造函数中使用它们而不会获得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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Cri*_*inH 13

我刚才补充道

: this()
Run Code Online (Sandbox Code Playgroud)

在参数化构造函数之后.这是一个猜测,但它似乎工作.

  • 不幸的是,它似乎在自定义构造函数中执行任何代码之前调用基础构造函数 (4认同)

R. *_*des 3

通常,当您链接构造函数时,情况恰恰相反:默认构造函数使用默认值调用更具体的构造函数。假设您有一个采用 x 和 y 坐标的 Point 构造函数。然后,您可以让默认的 Point 构造函数使用 x = 0 和 y = 0 调用另一个构造函数。这样您只需编写代码来设置一次值。

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

  1. 您将beginningDiagonalPoint和初始化endingDiagonalPoint为新点,然后使用对diagnonal.startPoint和 的引用覆盖它们diagnonal.endPoint。您正在创建两个新点,然后丢弃它们。您不需要创建这些新点。

  2. 您可以使用默认构造函数创建新的点和新的线,然后手动设置它们的字段。您可以创建一个接收两个坐标并设置它们的点构造函数,以及一个接收两个端点并设置它们的线构造函数。你的代码看起来像这样:

     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);
    
    Run Code Online (Sandbox Code Playgroud)