我在理解以下代码片段中的一行时遇到了问题(摘自本书: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))
提前致谢!
答案 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)
让我们自己解决问题吧。它解释了许多事情,因为你已经从书中获取了它,但在现实世界中,你必须为自己思考。
:this(new RectangleF(x,y,width,height)) 上面的行用于调用另一个构造函数,也称为构造函数。当您使用匹配的签名首先执行该构造函数时。它意味着你分配给任何类变量的值,在该构造函数中赋值然后你的构造函数被调用。因此,在当前构造函数中,如果要执行在基本构造函数中无法执行的任何其他逻辑,则可以执行此操作。
代码重用是这里的主要关注点。现在为什么? 问题是如果宽度和高度小于零那么你必须抛出异常。现在,您已经为类创建了两个构造函数,因为您希望类的用户可以将Ecplice设置作为x,y,width,height格式或矩形格式传递。