难以理解重载类构造函数的语法

时间:2016-11-19 10:07:56

标签: c# inheritance constructor

我在理解以下代码片段中的一行时遇到了问题(摘自本书:MCSD Certification Toolkit(考试70-483)C#编程)... 这里的问题集如下:

创建一个表示椭圆的Ellipse类。它应该将椭圆的大小和位置存储在RectangleF类型的Location属性中(在System.Drawing命名空间中定义)。给它两个构造函数:一个将RectangleF作为参数,一个取X位置,Y位置,宽度, 和高度作为参数。使第二个构造函数调用第一个构造函数,并在宽度或高度小于或等于0时使构造函数抛出异常。

class Ellipse
{
    public RectangleF Location { get; set; }

    // Constructor that takes a RectangleF as a parameter.
    public Ellipse(RectangleF rect)
    {
         // Validate width and height.
        if (rect.Width <= 0)
            throw new ArgumentOutOfRangeException("width", "Ellipse width must be greater than 0.");

        if (rect.Height <= 0)
            throw new ArgumentOutOfRangeException("height", "Ellipse height must be greater than 0.");

        // Save the location.
        Location = rect;
    }

   // Constructor that takes x, y, width, and height as parameters.
   public Ellipse(float x, float y, float width, float height)
       : this(new RectangleF(x, y, width, height))
   {
   }
}

我在理解以下问题时遇到问题...... 任何人都可以解释以下行的内容吗?请在解释中详细说明一下!

:this(new RectangleF(x, y, width, height))

提前致谢!

2 个答案:

答案 0 :(得分:2)

它的作用

有问题的行使用提供给构造函数的参数创建RectangleF的新实例。然后使用第一个构造函数使用创建的Ellipse初始化RectanlgeF的实例。

为什么这很有用

初始化Ellipse时有很多逻辑。人们可以像在第一个construtor中那样初始化它,但这意味着重复逻辑 - 带有它带来的所有坏处。通过这种方式,您可以通过一个单一的方式来初始化新的Ellipse,但可以通过多种方式创建此类实例。

考虑在Ellipse可用的地方创建RectangleF的新实例,并且只实现Ellipse的第一个构造函数。你必须解构&#39;调用矩形

var ellipse = new Ellipse(myrect.X, myrect.Y, myrect.Width, myrect.Height);

使用额外的contrsutor这样会更方便。

创建构造函数(或方法)的不同版本通常被称为“语法糖”。因为它使编码员的生活更加美好。

希望这有帮助。

答案 1 :(得分:1)

让我们自己解决问题吧。它解释了许多事情,因为你已经从书中获取了它,但在现实世界中,你必须为自己思考。

  1. :this(new RectangleF(x,y,width,height)) 上面的行用于调用另一个构造函数,也称为构造函数。当您使用匹配的签名首先执行该构造函数时。它意味着你分配给任何类变量的值,在该构造函数中赋值然后你的构造函数被调用。因此,在当前构造函数中,如果要执行在基本构造函数中无法执行的任何其他逻辑,则可以执行此操作。

  2. 代码重用是这里的主要关注点。现在为什么? 问题是如果宽度和高度小于零那么你必须抛出异常。现在,您已经为类创建了两个构造函数,因为您希望类的用户可以将Ecplice设置作为x,y,width,height格式或矩形格式传递。

    • 一种方法是你写宽度和高度登录这两个地方都不好。
    • 第二个问题是如果你使用了第一个构造函数,那么它将值作为矩形传递,第二个作为x,y,width,height传递,如果你不将这个值存储在单个位置,那么稍后会在代码中出现问题正在调用哪个构造函数。因为如果你已经调用了第一个,那么基于第二个x,y,width,height的所有逻辑将不起作用,如果你调用了第二个,那么与Rectangle相关的逻辑不起作用。因此,您可能必须存储额外的信息,然后调用哪个构造函数,这在这种情况下并不好,因为RectangleF将存储相同的值。