2010-07-12 7 views
8

In un inizializzatore C#, non desidero impostare una proprietà se una condizione è falsa.Assegnazione condizionale inizializzatore C#

Qualcosa di simile a questo:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    if (!windowsAuthentication) 
    { 
     Login = user, 
     Password = password 
    } 
}; 

Si può fare? Come?

risposta

9

Non puoi farlo; Gli inizializzatori C# sono una lista di coppie nome = valore. Vedi qui per i dettagli: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Avrete bisogno di spostare il blocco if alla seguente riga.

+3

Ciao, perché il downvote? Questa informazione non è corretta? –

+0

C'è un modo migliore, come @SLaks menzionato di seguito –

21

Questo non è possibile in un inizializzatore; è necessario creare un'istruzione separata if.

In alternativa, si può essere in grado di scrivere

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null : password 
}; 

(A seconda di come i tuoi ServerConnection opere di classe)

+0

Perché era questo downvoted? – SLaks

+0

È stata colpa mia. Inizialmente ti ho downvoted quando tutto ciò che avevi nella tua risposta era che non è possibile, prima di aggiungere i tuoi operatori terziari. Ora è apparentemente bloccato e non posso annullare il voto. Grazie, grazie! – Randolpho

+1

@Randolpho: ora puoi annullarlo. – SLaks

3

Nota: Non consiglio questo approccio, ma se necessario essere fatto in un inizializzatore (vale a dire che si sta utilizzando LINQ o qualche altro luogo in cui deve essere una singola istruzione), è possibile utilizzare questo:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null : password, 
} 
5

Sospetto che funzioni, ma l'utilizzo della logica in questo modo annulla lo scopo dell'utilizzo dell'inizializzatore.

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null :password 
}; 
3

Come già menzionato, questo non può essere fatto esattamente all'interno di un inizializzatore. È accettabile assegnare semplicemente null alla proprietà invece di non impostarla affatto? Se è così, puoi usare l'approccio che altri hanno indicato. Ecco un'alternativa che compie ciò che si vuole e utilizza ancora la sintassi di inizializzazione:

ServerConnection serverConnection; 
if (!windowsAuthentication) 
{ 
    serverConection = new ServerConnection() 
    { 
     ServerInstance = server, 
     LoginSecure = windowsAuthentication, 
     Login = user, 
     Password = password 
    }; 
} 
else 
{ 
    serverConection = new ServerConnection() 
    { 
     ServerInstance = server, 
     LoginSecure = windowsAuthentication, 
    }; 
} 

A mio parere, non dovrebbe davvero importa molto. A meno che tu non abbia a che fare con tipi anonimi, la sintassi dell'inizializzatore è solo una caratteristica piacevole che può rendere il tuo codice più ordinato in alcuni casi. Direi, non fare il possibile per usarlo per inizializzare tutte le proprietà se sacrifica la leggibilità. Non c'è niente di sbagliato nel fare il seguente codice invece:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
}; 

if (!windowsAuthentication) 
{ 
    serverConnection.Login = user, 
    serverConnection.Password = password 
} 
0

ne dite di questo:

ServerConnection serverConnection = new ServerConnection(); 

serverConnection.ServerInstance = server; 
serverConnection.LoginSecure = windowsAuthentication; 

if (!windowsAuthentication) 
{ 
    serverConnection.Login = user; 
    serverConnection.Password = password; 
}