14

A valore nominale, sembrerebbe che gli inizializzatori di oggetti presentino un problema per i "contratti di codice" .net 4.0, dove normalmente l'invariante deve essere stabilito al momento in cui il costruttore dell'oggetto è terminato. Presumibilmente, tuttavia, gli inizializzatori di oggetti richiedono che le proprietà vengano impostate al termine della costruzione.Contratti di codice vs. Inizializzatori di oggetti (.net 4.0)

La mia domanda è se gli invarianti dei "contratti di codice" sono in grado di gestire gli inizializzatori di oggetti, "come se" le proprietà fossero impostate prima che il costruttore fosse completato? Sarebbe davvero molto carino !!

+0

e 'questa la stessa domanda come http://stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor? Se lo è, è molto più chiaro e preciso, ma se non lo è, forse dovresti enfatizzare cosa c'è di diverso in questo ... –

risposta

9

Bene, suppongo che i Contratti di codice potrebbero inserire una chiamata extra a un invariante alla fine dell'inizializzatore dell'oggetto, se esso potrebbe indicare che era in uso. (Non dimenticare che utilizza principalmente l'IL piuttosto che il codice sorgente, per quanto ne so, il codice sorgente è usato solo per generare messaggi di errore.)

Questo mi sembra un design scarso - incoraggiato dalla sfortunata natura degli inizializzatori di oggetti. Cosa farebbe per impostare le proprietà dopo l'inizializzatore dell'oggetto? Potrebbero rendere l'oggetto nuovamente non valido.

Sembra praticamente che almeno alcune proprietà siano immutabili, ma si desidera il vantaggio della semplicità degli inizializzatori di oggetti. argomenti con nome e parametri opzionali in C# 4 darvi alcune di queste - creare un costruttore con tutte le proprietà appropriate (e valori di default), allora si può chiamare in questo modo:

Person person = new Person(firstName: "Jon", lastName: "Skeet"); 

Questo non è lontano l'oggetto sintassi initializer:

Person person = new Person { FirstName = "Jon", LastName = "Skeet" }; 

non è l'ideale, e mi auguro C# aveva più il supporto per i tipi immutabili (sia creazione e l'utilizzo), ma è un inizio ...

+0

Sono d'accordo, un maggiore supporto per i tipi immutabili in C# sarebbe fantastico. – Steven

+0

Hip Hip Hooray per argomenti con nome e parametri opzionali! Due delle piccole funzionalità di VB che ho perso dal salto in nave. –

+0

@Jon: In realtà "l'impostazione delle proprietà dopo l'inizializzatore dell'oggetto" non mi allarma, poiché il client è responsabile di non interrompere la precondizione associata a ciascuna proprietà. Voglio solo evitare una situazione in cui praticamente non posso fornire un invariante, perché gli inizializzatori degli oggetti ei contratti di codice non vanno d'accordo. Suona come se la giuria fosse fuori sugli inizializzatori di oggetti, come dici tu "i contratti di codice * potrebbero * effettuare una chiamata a un invariante quando gli inizializzatori di oggetti completano". Ma sembra più probabile che i parametri opzionali/predefiniti funzioneranno bene con i contratti di codice –