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

标签 c# inheritance constructor

我在理解以下代码片段中的一行时遇到问题(摘自本书:MCSD 认证工具包(考试 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))

提前致谢!

最佳答案

它的作用

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

为什么这有用

Ellipse 的初始化有很多逻辑。人们可以用在第一个构造函数中完成的相同方式初始化它,但这将意味着逻辑重复 - 随之而来的所有坏处。通过这种方式,您可以在一个地方负责初始化一个新的 Ellipse,但您可以通过多种方式创建这样的实例。

考虑在一个可用的 RectangleF 的地方创建一个 Ellipse 的新实例,并且只实现了 Ellipse 的第一个构造函数.您必须通过调用来“解构”矩形

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

有了额外的解释器,这就更方便了。

创建不同版本的构造函数(或方法)通常被称为“语法糖”,因为它可以使编码人员的生活变得甜美。

希望这对您有所帮助。

关于c# - 难以理解重载类构造函数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691575/

相关文章:

constructor - Kotlin 的数据类主构造函数中的局部参数

C# 如何为违反 Equals 契约的类选择 Hashcode?

c# - 副线程出现异常,如何在主线程中捕获异常?

c# - 通用类型层次结构的 DataContractSerialization

C++类错误'const class Number'没有名为 'intValue'的成员

c++ - 选择模板参数不同的模板类构造器导致编译失败

c# - Microsoft Word 自动化/互操作 Win32 API 问题

c# - 无法调试 - "The breakpoint will not currently be hit. No symbols have been loaded for this document"

java - 如何使用静态方法设计类

java - 为什么我不能实例化这样的对象?