270 votes

C # constructeur constructeur en chaîne? (Comment faire?)

Je sais que c'est soi-disant une super question simple, mais j'ai eu du mal avec le concept pendant un certain temps maintenant. Ma question est, comment voulez-vous la chaîne des constructeurs en c#? Je suis dans ma première programmation orientée objet classe, donc je suis en train d'apprendre. Je ne comprends pas comment constructeur de chaînage ou comment la mettre en œuvre, ou même pourquoi c'est mieux que de simplement faire des constructeurs sans chaînage.

J'apprécierais quelques exemples avec une explication.

Alors, comment faire comment de la chaîne d'eux? Je sais avec les deux que ça se passe:

public SomeClass this: {0}

public SomeClass
{
    someVariable = 0
} 

Mais comment faites-vous avec trois, quatre, et ainsi de suite?

Encore une fois, je sais que c'est une question de débutant, mais j'ai du mal à comprendre cela et je ne sais pas pourquoi.

420voto

Marc Gravell Points 482669

Vous utilisez la syntaxe standard (à l'aide d' this d'une méthode) pour choisir la surcharge, à l'intérieur de la classe:

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) {
    }
}

alors:

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

Note:

  • vous pouvez la chaîne des constructeurs sur la base-type à l'aide d' base(...)
  • vous pouvez mettre un code dans chaque constructeur
  • la valeur par défaut (si vous ne spécifiez rien) est - base()

"Pourquoi?":

  • code de réduction (toujours une bonne chose)
  • nécessaire d'appeler un non-défaut de base du constructeur, par exemple:

    SomeBaseType(int id) : base(id) {...}
    

Notez que vous pouvez également utiliser les initialiseurs d'objets d'une manière similaire, si (sans avoir besoin d'écrire quoi que ce soit):

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

62voto

ES3178 Points 271

Je veux juste apporter un point valide pour toute personne à la recherche pour cela. Si vous allez travailler avec .NET les versions antérieures à 4.0 (VS2010), s'il vous plaît noter que vous devez créer constructeur de chaînes comme indiqué ci-dessus.

Toutefois, si vous êtes en séjour dans la version 4.0, j'ai de bonnes nouvelles. Vous pouvez maintenant avoir un seul constructeur avec arguments optionnels! Je vais simplifier la classe Foo exemple:

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

Lorsque vous implémentez le constructeur, vous pouvez utiliser les arguments facultatifs puisque les valeurs par défaut ont été définies.

J'espère que vous avez apprécié cette leçon! Je ne peux pas croire que les développeurs ont été se plaindre au sujet de construction de chaînage et de ne pas pouvoir utiliser la valeur par défaut des arguments optionnels depuis 2004/2005! Maintenant, il a pris TELLEMENT de temps dans le monde du développement, que les développeurs ont peur de l'utiliser car il ne sera pas rétro-compatible.

33voto

blowdart Points 28735

Ce fait est illustré par un exemple. D'imagerie, nous avons une Personne de la classe

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

Nous avons donc ici un constructeur qui initialise les propriétés et les utilisations constructeur de chaînage pour vous permettre de créer l'objet avec juste un nom, ou juste un nom et une adresse. Si vous créez une instance avec seulement un nom, cela va donner une valeur par défaut de la chaîne.Vide à travers le nom et l'adresse, qui envoie alors une valeur par défaut pour le code Postal pour la finale du constructeur.

En agissant de la sorte vous êtes à la réduction de la quantité de code que vous avez écrit. Un seul constructeur a en fait dans le code, vous n'êtes pas vous répéter vous-même, de sorte que, par exemple, si vous modifiez le Nom d'une propriété à un champ interne vous avez seulement besoin de changer un constructeur - si vous définissez cette propriété à tous les trois constructeurs qui serait trois places pour le changer.

12voto

KhanSharp Points 1754

J’ai une classe de journal et si je n’écris pas définissant les valeurs encore et encore

6voto

Manish Basantani Points 4347

Est-ce que vous demandez à ce sujet?

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

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X