【发布时间】:2012-02-08 15:44:53
【问题描述】:
如果有多个构造函数,另一个构造函数调用一个构造函数有什么好处? 谢谢
【问题讨论】:
-
那么,从另一个方法调用有什么好处呢?构造函数只是在产生
new运算符的结果之前调用的方法。
标签: c# asp.net-mvc-3
如果有多个构造函数,另一个构造函数调用一个构造函数有什么好处? 谢谢
【问题讨论】:
new 运算符的结果之前调用的方法。
标签: c# asp.net-mvc-3
你不会重复自己。
实现一个构造函数的更改也会立即影响所有其他构造函数。 复制和粘贴代码是不好的,应该避免。
与方法重载相同的优势:无需重复相同的代码
public class Person
{
public Person(string name,string lastName )
{
Name = name;
LastName = lastName;
}
public Person(string name, string lastName,string address):this(name,lastName)
{
//you don't need to set again Name and Last Name
//as you can call the other constructor that does the job
Address = Address;
}
public string Name { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
}
【讨论】:
查看已经发布的答案,我会告诉他们你总是从默认构造函数一直走到最专业的构造函数。试图反过来做同样的事情总是会导致代码重复或问题:
好办法:
public class Foo()
{
public Foo()
: this(String.Empty)
{ }
public Foo(string lastName)
: this(lastName, String.Empty)
{ }
public Foo(string lastName, string firstName)
: this(lastName, firstName, 0)
{ }
public Foo(string lastName, string firstName, int age)
{
LastName = lastName;
FirstName = firstName;
Age = age;
_SomeInternalState = new InternalState();
}
}
坏方法:
public class Foo()
{
public Foo(string lastName, string firstName, int age)
: this(lastName, firstName)
{
Age = age;
}
public Foo(string lastName, string firstName)
: this(lastName)
{
FirstName = firstName;
}
public Foo(string lastName)
: this()
{
LastName = lastName;
}
public Foo()
{
_SomeInternalState = new InternalState();
}
}
第二个例子的问题是,如何处理所有参数的部分现在被所有构造函数弄乱了,而是只在一个(最专业的)中实现。想象一下你喜欢从这个类派生。在第二个示例中,您必须覆盖所有构造函数。在第一个示例中,您只需覆盖最专业的构造函数即可完全控制每个构造函数。
【讨论】:
Foo 是父类并且您有类Bar : Foo 并且您想实现Bar(last, first) : base(last, first) 我认为这两种方法都没有问题.我会说第一种方法可以很好地将所有参数设置在一个地方,只是为了寻找,但它并没有涵盖您可能想要链接构造函数的 所有 情况。想象一下两个在设置过程中调用不同方法的构造函数,它们具有共同的“基础”实现,但不应相互调用
如果您想将默认值传递给基本构造函数。
public class YourClass
{
private int SomeInt;
public YourClass() : this(0)
{
// other possible logic
}
public YourClass(int SomeNumber)
{
SomeInt = SomeNumber;
}
}
这遵循 DRY 原则(不要重复自己)。一个简单的例子,但它应该能说明这个想法。
【讨论】:
当我想将默认值或空值传递给其他构造函数时,我使用了它。在上述情况下,用户在调用构造函数时不必传递 null —— 他们可以一无所有地调用它。
public class Widget(){
public Widget() : this(null){
}
public Widget(IRepository rep){
this.repository = rep;
}
}
【讨论】: