C# 使用构造器链接完成此构造的正确方法?
我有一个关于我的第一个OOP类的作业,我理解其中的所有内容,包括以下语句: 您应该创建一个名为ComplexNumber的类。此类将包含定义为双精度的私有数据成员中复数的实部和虚部。类应该包含一个构造函数,该构造函数允许将虚数的数据成员指定为构造函数的参数。默认(非参数化)构造函数应将数据成员初始化为0.0 当然,我知道如何创建这些构造函数而不将它们链接在一起,任务也不需要将它们链接在一起,但我想按照我喜欢的方式创建它们 如果不将它们链接在一起,我的构造函数如下所示:C# 使用构造器链接完成此构造的正确方法?,c#,constructor,complex-numbers,constructor-chaining,C#,Constructor,Complex Numbers,Constructor Chaining,我有一个关于我的第一个OOP类的作业,我理解其中的所有内容,包括以下语句: 您应该创建一个名为ComplexNumber的类。此类将包含定义为双精度的私有数据成员中复数的实部和虚部。类应该包含一个构造函数,该构造函数允许将虚数的数据成员指定为构造函数的参数。默认(非参数化)构造函数应将数据成员初始化为0.0 当然,我知道如何创建这些构造函数而不将它们链接在一起,任务也不需要将它们链接在一起,但我想按照我喜欢的方式创建它们 如果不将它们链接在一起,我的构造函数如下所示: class Complex
class ComplexNumber
{
private double realPart;
private double complexPart;
public ComplexNumber()
{
realPart = 0.0;
complexPart = 0.0
}
public ComplexNumber(double r, double c)
{
realPart = r;
complexPart = c;
}
// the rest of my class code...
}
这就是你要找的吗
public ComplexNumber()
: this(0.0, 0.0)
{
}
public ComplexNumber(double r, double c)
{
realPart = r;
complexPart = c;
}
@Rex拥有链接的连接答案 但是,在这种情况下,不需要链接或任何初始化。CLR将在对象构造函数期间将字段初始化为其默认值。对于Double,这将使其初始化为0.0。因此,在默认构造函数的情况下,赋值并不是绝对必要的 不过,有些人更喜欢显式初始化他们的字段以获取文档或可读性 我仍在试图掌握构造函数链接的概念,因此它是有效的,但为什么/如何 通过在构造函数定义中使用“this”关键字实现构造函数链接的“how”,如Rex M的示例所示
构造函数链接的“原因”是重用构造函数的实现。如果第二个构造函数的实现(主体)很长且复杂,那么您可能希望重用它(即链接到它或调用它),而不是复制并粘贴到其他构造函数中。另一种方法是将多个构造函数之间共享的代码放入从多个构造函数调用的公共子例程中:但是,不允许该子例程初始化
只读
字段(只能从构造函数初始化,不能从子例程初始化),因此,构造函数链接是一种解决方法。Ahh,是的,将它们都初始化为0.0,谢谢!我仍在试图掌握构造函数链接的概念,因此它是有效的,但为什么/如何?我的教授没有涉及构造函数链接,他也不会,但我想学习如何使用它。@Alex它与调用其他方法非常相似,只是构造函数没有名称-因此我们只调用this.Method()
,或者调用父类/超类上的构造函数,base()
就像方法链接一样;您正在使用B所需的参数从构造函数A调用构造函数B。好的,感谢您的帮助,还有一个问题,如果我想在默认构造函数中将我的数据成员构造为0,但我的带参数构造函数接受一些对象,而我的数据成员是整数、双精度、浮点,等等?@Alex:那么,您的非默认构造函数在哪里为成员获取初始值呢?无论如何。。。构造函数链接是一种方便的构造。C#4.0使这项任务在System.Numerics.Complex
=)中过时了,太糟糕了,我不得不自己做了!:)啊哈,要是我们所有人都能在最新最棒的版本一出来就跳上去就好了。我仍在使用.NET 2.0和VS2005:-)两个旁注:1)您不需要将成员初始化为0.0
,因为这是double
成员的默认值(对于int
,类似地0
,对于引用类型,等等);2) 您可以使用初始值设定项:private double realPart=0.0代码>。感谢您的解释,但是是否绝对需要创建默认构造函数?(在c#)对于某些序列化过程,是的。我发现需要默认构造函数的一个地方是在对某些对象(例如datagridview)进行数据绑定时,您的类是一个典型的“值类”(也就是说,它代表一些值,其对象标识本身不具有任何语义意义。对于此类类,有一个默认的/“零”值是合理的,就像正确的值类型-int
,bool
,等等一样。因此,出于一致性原因,默认构造函数是有意义的-就像我可以编写new int()
和get0
,我应该能够编写新的ComplexNumber()
,并获得0+0i
。然而,一般来说,并不是所有类都需要默认构造函数,特别是当对象需要一些外部数据来初始化时,许多类不需要默认构造函数。