2010-07-12 12 views
8

In einem C# Initialisierer möchte ich keine Eigenschaft festlegen, wenn eine Bedingung falsch ist.C# Initialisierer bedingte Zuweisung

Etwas wie folgt aus:

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

Es kann getan werden? Wie?

Antwort

9

Sie können das nicht tun; C# -Initialisierer sind eine Liste von Name = Wert-Paaren. Hier finden Sie Details: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Sie müssen den if Block in die folgende Zeile verschieben.

+3

Hallo, warum der Downvote? Sind diese Informationen nicht korrekt? –

+0

Es gibt einen besseren Weg, wie @SLaks unten erwähnt –

21

Dies ist in einem Initialisierer nicht möglich; Sie müssen eine separate if Aussage machen.

Alternativ können Sie in der Lage zu schreiben

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

(Je nachdem, wie ServerConnection Klasse works)

+0

Warum wurde dieses Downvoted? – SLaks

+0

Das war meine Schuld. Ich habe Sie ursprünglich abgelehnt, als Sie in Ihrer Antwort nur sagten, dass es nicht möglich ist, bevor Sie Ihre tertiären Operatoren hinzugefügt haben. Jetzt ist es offensichtlich eingesperrt und ich kann die Abstimmung nicht zurücknehmen. Danke Server Barfs! – Randolpho

+1

@Randolpho: Jetzt können Sie es rückgängig machen. – SLaks

3

Hinweis: Ich habe diesen Ansatz nicht empfehlen, aber wenn es muss in getan werden ein Initialisierer (dh Sie verwenden LINQ oder einen anderen Ort, an dem es eine einzelne Anweisung sein muss), können Sie dies verwenden:

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

Ich vermute, das würde funktionieren, aber mit Logik auf diese Weise eine Art besiegt den Zweck der Verwendung des Initialisierers.

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

Wie andere erwähnt, kann dies nicht genau innerhalb eines Initialisierers getan werden. Ist es akzeptabel, der Eigenschaft nur den Wert Null zuzuweisen, anstatt sie überhaupt zu setzen? Wenn ja, können Sie den Ansatz verwenden, auf den andere hingewiesen haben. Hier ist eine Alternative, die erreicht, was Sie wollen und verwendet immer noch die initializer Syntax:

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

Meiner Meinung nach, sollte es nicht wirklich viel aus. Wenn Sie nicht mit anonymen Typen arbeiten, ist die Initialisierersyntax nur ein nettes Feature, das Ihren Code in manchen Fällen aufgeräumter aussehen lässt. Ich würde sagen, gehen Sie nicht aus dem Weg, um es zu verwenden, um alle Ihre Eigenschaften zu initialisieren, wenn es die Lesbarkeit beeinträchtigt. Es ist nichts falsch mit, anstatt den folgenden Code ausführen:

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

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

Wie wäre es damit:

ServerConnection serverConnection = new ServerConnection(); 

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

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