我知道这应该是一个超级简单的问题,但我已经在这个概念上挣扎了一段时间。

我的问题是,如何在c#中使用链构造函数?

我第一次上面向对象编程课,所以我还在学习。我不明白构造函数链接是如何工作的,如何实现它,甚至为什么它比没有链接的构造函数更好。

我希望你能给我一些解释的例子。

那么怎么把它们拴起来呢? 我知道这句话是:

public SomeClass this: {0}

public SomeClass
{
    someVariable = 0
} 

但是你怎么处理3个,4个等等?

再说一次,我知道这是一个初学者的问题,但我很难理解,我不知道为什么。


当前回答

我只是想提出一个有效的观点,任何人搜索这个。如果你要使用。net 4.0 (VS2010)之前的版本,请注意你必须创建如上所示的构造函数链。

然而,如果你仍然停留在4.0,我有一个好消息。您现在可以拥有一个带有可选参数的构造函数!我将简化Foo类的例子:

class Foo {
  private int id;
  private string name;

  public Foo(int id = 0, string name = "") {
    this.id = id;
    this.name = name;
  }
}

class Main() {
  // Foo Int:
  Foo myFooOne = new Foo(12);
  // Foo String:
  Foo myFooTwo = new Foo(name:"Timothy");
  // Foo Both:
  Foo myFooThree = new Foo(13, name:"Monkey");
}

在实现构造函数时,可以使用可选参数,因为已经设置了默认值。

我希望你喜欢这节课!我只是不敢相信开发人员从2004/2005年开始就一直在抱怨构造链和不能使用默认可选参数!现在它在开发世界中已经花费了很长时间,以至于开发人员都害怕使用它,因为它不能向后兼容。

其他回答

你可以使用标准语法(像使用方法一样)在类内部选择重载:

class Foo 
{
    private int id;
    private string name;

    public Foo() : this(0, "") 
    {
    }

    public Foo(int id, string name) 
    {
        this.id = id;
        this.name = name;
    }

    public Foo(int id) : this(id, "") 
    {
    }

    public Foo(string name) : this(0, name) 
    {
    }
}

然后:

Foo a = new Foo(), b = new Foo(456,"def"), c = new Foo(123), d = new Foo("abc");

还请注意:

可以使用base(…)链接到基类型上的构造函数。 您可以在每个构造函数中放入额外的代码 默认值(如果你不指定任何东西)是base()

“为什么?”:

代码减少(总是一件好事) 必须调用非默认的基构造函数,例如: SomeBaseType(int id): base(id){…}

注意,你也可以以类似的方式使用对象初始化器,尽管(不需要写任何东西):

SomeType x = new SomeType(), y = new SomeType { Key = "abc" },
         z = new SomeType { DoB = DateTime.Today };

你是在问这个吗?

  public class VariantDate {
    public int day;
    public int month;
    public int year;

    public VariantDate(int day) : this(day, 1) {}

    public VariantDate(int day, int month) : this(day, month,1900){}

    public VariantDate(int day, int month, int year){
    this.day=day;
    this.month=month;
    this.year=year;
    }

}

用一个例子最好地说明了这一点。假设我们有一个类Person

public Person(string name) : this(name, string.Empty)
{
}

public Person(string name, string address) : this(name, address, string.Empty)
{
}

public Person(string name, string address, string postcode)
{
    this.Name = name;
    this.Address = address;
    this.Postcode = postcode;
}

这里我们有一个构造函数,它设置了一些属性,并使用构造函数链来允许你创建一个只有名字或者只有名字和地址的对象。如果创建的实例只有名称,则会发送一个默认值string。空到名称和地址,然后将Postcode的默认值发送到最终构造函数。

这样做可以减少所编写的代码量。实际上只有一个构造函数中有代码,你不是在重复自己,所以,例如,如果你将Name从一个属性更改为一个内部字段,你只需要更改一个构造函数——如果你在所有三个构造函数中都设置了该属性,那么就有三个地方可以更改它。

我只是想提出一个有效的观点,任何人搜索这个。如果你要使用。net 4.0 (VS2010)之前的版本,请注意你必须创建如上所示的构造函数链。

然而,如果你仍然停留在4.0,我有一个好消息。您现在可以拥有一个带有可选参数的构造函数!我将简化Foo类的例子:

class Foo {
  private int id;
  private string name;

  public Foo(int id = 0, string name = "") {
    this.id = id;
    this.name = name;
  }
}

class Main() {
  // Foo Int:
  Foo myFooOne = new Foo(12);
  // Foo String:
  Foo myFooTwo = new Foo(name:"Timothy");
  // Foo Both:
  Foo myFooThree = new Foo(13, name:"Monkey");
}

在实现构造函数时,可以使用可选参数,因为已经设置了默认值。

我希望你喜欢这节课!我只是不敢相信开发人员从2004/2005年开始就一直在抱怨构造链和不能使用默认可选参数!现在它在开发世界中已经花费了很长时间,以至于开发人员都害怕使用它,因为它不能向后兼容。

我有一个日记类,所以我没有写设置值一次又一次

public Diary() {
    this.Like = defaultLike;
    this.Dislike = defaultDislike;
}

public Diary(string title, string diary): this()
{
    this.Title = title;
    this.DiaryText = diary;
}

public Diary(string title, string diary, string category): this(title, diary) {
    this.Category = category;
}

public Diary(int id, string title, string diary, string category)
    : this(title, diary, category)
{
    this.DiaryID = id;
}