C # инициализатор условного присваивания - PullRequest
13 голосов
/ 12 июля 2010

В инициализаторе c # я не хочу устанавливать свойство, если условие ложно.

Примерно так:

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

Это можно сделать? Как?

Ответы [ 6 ]

29 голосов
/ 12 июля 2010

Это невозможно в инициализаторе;вам нужно сделать отдельный оператор if.

В качестве альтернативы вы можете написать

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

(в зависимости от того, как работает ваш класс ServerConnection)

12 голосов
/ 12 июля 2010

Вы не можете сделать это; Инициализаторы C # - это список пар имя = значение. Подробности смотрите здесь: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Вам нужно переместить блок if на следующую строку.

6 голосов
/ 12 июля 2010

Я подозреваю, что это сработает, но использование логики таким образом побеждает цель использования инициализатора.

ServerConnection serverConnection = new ServerConnection()  
{  
    ServerInstance = server,  
    LoginSecure = windowsAuthentication,  
    Login = windowsAuthentication ? null : user,
    Password = windowsAuthentication ? null :password
};
4 голосов
/ 12 июля 2010

Примечание: я не рекомендую этот подход, но если он должен быть сделан в инициализаторе (т. Е. Вы используете LINQ или другое место, где это должен быть один оператор), вы можетеиспользуйте это:

ServerConnection serverConnection = new ServerConnection()
{
    ServerInstance = server,  
    LoginSecure = windowsAuthentication,  
    Login = windowsAuthentication ? null : user,
    Password = windowsAuthentication ? null : password,   
}
3 голосов
/ 12 июля 2010

Как уже упоминалось, это не может быть сделано в инициализаторе.Допустимо ли присваивать свойству значение null, а не устанавливать его вообще?Если это так, вы можете использовать подход, который указали другие.Вот альтернатива, которая выполняет то, что вы хотите, и все еще использует синтаксис инициализатора:

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

На мой взгляд, это не должно иметь большого значения.Если вы не имеете дело с анонимными типами, синтаксис инициализатора просто полезен, если в некоторых случаях ваш код выглядит более аккуратным.Я бы сказал, не пытайтесь использовать его для инициализации всех ваших свойств, если он жертвует читабельностью.Нет ничего плохого в выполнении следующего кода:

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

if (!windowsAuthentication)
{
    serverConnection.Login = user,
    serverConnection.Password = password
}
1 голос
/ 18 августа 2017

Как насчет этого:

ServerConnection serverConnection = new ServerConnection();  

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

if (!windowsAuthentication)
{
     serverConnection.Login = user;  
     serverConnection.Password = password;  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...