Domanda

Ho visto queste due cose ultimamente e io sono un po 'confuso.

var blah = new MyClass() { Name = "hello" } 

e

var blah = new MyClass { Name = "hello" } 

Che cosa è la differenza? e perché entrambi lavorano?

Aggiornamento: Questo significa che se ho qualcosa in un costruttore che fa un po 'di calcolo che avrei dovuto chiamare il primo ??

È stato utile?

Soluzione

Per quanto ne so, sono esattamente equivalenti. La specifica C # (o almeno l'implementazione Microsoft di esso) consente di omettere il () quando si utilizza il costruttore predefinito (senza parametri) fino a quando si sta utilizzando parentesi graffe (vale a dire la sintassi per inizializzatori oggetto ). Si noti che l'inizializzatore di oggetto non fa alcuna differenza al costruttore qui - il new MyClass po 'viene comunque interpretato separatamente come una chiamata al costruttore di default. Personalmente, vi consiglio di includere sempre le parentesi tonde () per coerenza -. necessità quando non si dispone di un inizializzatore oggetto seguente

Altri suggerimenti

Non c'è alcuna differenza, prima forma ricorda proprio fuori che è sono anche chiamando il costruttore:

class Ö {
    public string Ä { get; set; }
    public string Å { get; set; }
    public Ö() { Å = "dear";}
    public Ö(string å) { Å = å; }    
}

Console.WriteLine(new Ö { Ä = "hello" }.Å);
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å);

si tradurrà in:

dear
world

Per aggiungere alle osservazioni di cui sopra, aggiungendo in più è sicuramente aiutare a chiarire ciò che il costruttore o il metodo init viene chiamato. Sicuramente un aspetto styling anche ....

Credo che mantengono la forma () per inizializzatori di oggetto in quanto alcuni utenti, come la chiarezza di () per invocare il costruttore, ma IIRC, C ++ (o le prime versioni) consentono invocando costruttore senza le parentesi. La mia seconda ipotesi, essi (lingua designer) sono appoggiato a fare C # hanno una struttura JSON-like, che è un pò ordinata, in modo facilitano invocando costruttore senza il (). Io sono a favore della seconda forma.

Non c'è alcuna differenza, proprio come la proprietà (anche se così male) di VB.NET permetterebbe di assegnare le variabili in due forme: button1.Height = 100 button1.Height () = 1000 Kinda zoppo, se si può chiedere.

In realtà non hanno molta differenza fino a quando avete a che fare con tipi che non hanno di default costruttore vuoto. In tal caso è possibile ottenere benefici a scrivere qualcosa come "nuova SomeClass (MandatoryArgument) {Prop1 = 1, prop2 = 2}"

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