2010-07-12 21 views
8

Dans un initialisateur C#, je ne souhaite pas définir une propriété si une condition est fausse.C# initialiser l'affectation conditionnelle

Quelque chose comme ceci:

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

Il peut être fait? Comment?

Répondre

9

Vous ne pouvez pas faire cela; Les initialiseurs C# sont une liste de paires nom = valeur. Voir ici pour plus de détails: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Vous devrez déplacer le bloc if sur la ligne suivante.

+3

Salut, pourquoi la downvote? Cette information est-elle incorrecte? –

+0

Il y a un meilleur moyen, comme @SLaks mentionné ci-dessous –

21

Ceci n'est pas possible dans un initialiseur; vous devez faire une déclaration distincte if.

Vous pouvez également être en mesure d'écrire

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

(selon la façon dont ServerConnection fonctionne classe)

+0

Pourquoi ce downvoted? – SLaks

+0

C'était de ma faute. À l'origine, je vous ai rabaissé quand tout ce que vous aviez dans votre réponse, c'est que ce n'est pas possible, avant d'ajouter vos opérateurs tertiaires. Maintenant, il est apparemment enfermé et je ne peux pas annuler le vote. Merci le serveur barfs! – Randolpho

+1

@Randolpho: Maintenant vous pouvez l'annuler. – SLaks

3

Note: Je ne recommande pas cette approche, mais si elle doit être fait en un initialiseur (vous utilisez LINQ ou un autre endroit où il doit être une seule instruction), vous pouvez utiliser ceci:

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

Je suppose que cela fonctionnerait, mais l'utilisation de la logique inverse le but de l'initialisation.

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

Comme d'autres ont mentionné, cela ne peut pas exactement être fait dans un initialiseur. Est-il acceptable d'assigner juste null à la propriété au lieu de ne pas le définir du tout? Si oui, vous pouvez utiliser l'approche que d'autres ont souligné. Voici une alternative qui accomplit ce que vous voulez et utilise encore la syntaxe initialiseur:

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

À mon avis, il ne devrait pas vraiment beaucoup. Sauf si vous avez affaire à des types anonymes, la syntaxe d'initialisation est juste une fonctionnalité intéressante qui peut rendre votre code plus propre dans certains cas. Je dirais, ne sortez pas de votre façon de l'utiliser pour initialiser toutes vos propriétés si elle sacrifie la lisibilité. Il n'y a rien de mal à faire plutôt le code suivant:

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

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

Que diriez-vous ceci:

ServerConnection serverConnection = new ServerConnection(); 

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

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