Domanda

Ho cercato di capire se ci sono differenze tra questi costruttori. Supponendo che esista un costruttore Foo () che non accetta argomenti, tutti questi costruttori avranno lo stesso risultato?

Esempio 1

public Foo()
    : this()
{
     blah;
     blah;
     blah;
}

Esempio 2

public Foo()
{
     this();
     blah;
     blah;
     blah;
}

Esempio 3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
È stato utile?

Soluzione

  • L'esempio 1 è valido (supponendo che esista un costruttore senza parametri) e chiama il costruttore senza parametri come parte dell'inizializzazione. Vedi il mio articolo sul concatenamento dei costruttori per maggiori dettagli. EDIT: Nota che dopo la modifica del PO, è infinitamente ricorsivo.
  • L'esempio 2 non è mai valido
  • L'esempio 3 è valido solo quando Foo è una struttura e non fa nulla di utile.

Eviterei di assegnare a questo nelle strutture. Come puoi vedere dalle altre risposte, la stessa possibilità è abbastanza raramente nota (lo so solo a causa di una strana situazione in cui è emersa nelle specifiche). Dove l'hai preso, non fa nulla di buono - e in altri luoghi è probabile che stia mutando la struttura, che non è una buona idea. Le strutture dovrebbero essere sempre immutabili :)

EDIT: solo per far andare le persone " meep! " un po '- assegnare a this non è la stessa cosa che concatenare un altro costruttore, come puoi farlo anche con i metodi:

using System;

public struct Foo
{
    // Readonly, so must be immutable, right?
    public readonly string x;

    public Foo(string x)
    {
        this.x = x;
    }

    public void EvilEvilEvil()
    {
        this = new Foo();
    }
}

public class Test
{
    static void Main()
    {
        Foo foo = new Foo("Test");
        Console.WriteLine(foo.x); // Prints "Test"
        foo.EvilEvilEvil();
        Console.WriteLine(foo.x); // Prints nothing
    }
}

Altri suggerimenti

Gli esempi 2 e 3 non sono C # legali.

EDIT: Jon sottolinea accuratamente che 3 è legale quando Foo è una struct . Vai a vedere la sua risposta!

No, non lo faranno perché solo il primo costruttore è effettivamente legale. Gli altri due sono illegali per vari motivi.

EDIT Interessante, 3 è davvero legale quando Foo è una struttura. Ma anche in quel caso, è un compito ridondante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top