2010-07-12 12 views
8

En un inicializador C#, no quiero establecer una propiedad si una condición es falsa.Asignación condicional del inicializador C#

Algo como esto:

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

Se puede hacer? ¿Cómo?

Respuesta

9

No puedes hacer esto; Los inicializadores de C# son una lista de pares nombre = valor. Consulte aquí para obtener más información: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Deberá mover el bloque if a la siguiente línea.

+3

Hola, ¿por qué el voto a favor? ¿Esta información no es correcta? –

+0

Hay una mejor manera, como @SLaks se menciona a continuación –

21

Esto no es posible en un inicializador; necesita hacer una declaración separada de if.

Alternativamente, puede ser capaz de escribir

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

(Dependiendo de cómo funciona su ServerConnection clase)

+0

¿Por qué este downvoted? – SLaks

+0

Eso fue mi culpa. Originalmente, te rechacé cuando todo lo que tenías en tu respuesta fue que no es posible antes de que hayas agregado a tus operadores terciarios. Ahora aparentemente está bloqueado y no puedo rescindir el voto. Gracias servidor barfs! – Randolpho

+1

@Randolpho: ahora puede rescindirlo. – SLaks

3

Nota: No recomiendo este enfoque, pero si debe hacerse de un inicializador (es decir, está utilizando LINQ u otro lugar donde tiene que ser una declaración única), puede usar esto:

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

Sospecho que esto funcionaría, pero el uso de la lógica de esta manera en cierto modo frustra el propósito de usar el inicializador.

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

Como han mencionado otros, esto no se puede hacer exactamente dentro de un inicializador. ¿Es aceptable simplemente asignarle un valor nulo a la propiedad en lugar de no configurarlo? Si es así, puede usar el enfoque que otros han señalado. Aquí es una alternativa que logra lo que quiere y sigue utilizando la sintaxis de inicializador:

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

En mi opinión, no debería realmente importa mucho. A menos que trabaje con tipos anónimos, la sintaxis del inicializador es simplemente una característica interesante que puede hacer que su código parezca más ordenado en algunos casos. Yo diría que no salgas de tu camino para usarlo para inicializar todas tus propiedades si sacrifica la legibilidad. No hay nada malo en hacer el código siguiente en su lugar:

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

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

¿Qué tal esto:

ServerConnection serverConnection = new ServerConnection(); 

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

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