由其他人调用一个构造函数

时间:2012-02-08 15:44:53

标签: c# asp.net-mvc-3

如果有多个构造函数,则通过其他方法调用一个构造函数有什么好处? 感谢

5 个答案:

答案 0 :(得分:8)

你不要重复自己。

实现一个构造函数的更改也会立即影响所有其他构造函数。 复制和粘贴代码很糟糕,应该避免使用。

答案 1 :(得分:6)

与方法重载相同的优点:您不会重复相同的代码

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; }
}

答案 2 :(得分:3)

查看已经发布的答案我将只是他们始终从默认构造函数向下走到最专业的构造函数。试图以相反的方式做同样的事情总会导致代码重复或问题:

好方法:

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();
    }
}

第二个例子的问题在于,所有参数的部分现在都混乱在所有构造函数上,而只是在一个(最专业的)中实现。想象一下你喜欢从这个课程中衍生出来。在第二个示例中,您必须覆盖所有构造函数。在第一个示例中,您只需覆盖最专业的构造函数即可完全控制每个构造函数。

答案 3 :(得分:1)

如果要将默认值传递给基础构造函数。

public class YourClass
{
    private int SomeInt;

    public YourClass() : this(0)
    {
        // other possible logic
    }

    public YourClass(int SomeNumber)
    {
        SomeInt = SomeNumber;
    }
}

遵循DRY原则(不要重复自己)。一个简单的例子,但它应该说明这个想法。

答案 4 :(得分:1)

当我想将默认值或空值传递给其他构造函数时,我使用它。在上面的例子中,用户在调用构造函数时不必传递null - 他们可以无需调用它。

public class Widget(){

    public Widget() : this(null){

    }

    public Widget(IRepository rep){
      this.repository = rep;
    }
}