работа с неустановленными переменными в C # - PullRequest
0 голосов
/ 28 октября 2011

это, вероятно, довольно простая проблема, однако я не могу понять, как обойти это. По сути, мой класс Client требует значения рабочего адреса, однако при создании клиента это не требуется на 100%. При создании переменной, которая будет использоваться для создания объекта, я использую строковое значение, которое затем получит значение из текстового поля. Затем я проверяю, является ли текстовое поле пустым, если оно есть, строковое значение переменной является просто пробелом. Иначе, это значение текстового поля.

string homeAdd;
if(homeAddressText.Text == String.Empty)
{
    homeAdd = " ";
}
else if (homeAddressText.Text != String.Empty)
{
    homeAdd = homeAddressText.Text;
}

Как видно здесь ..

Однако, когда я иду, чтобы создать клиентский объект, используя эту переменную, я получаю сообщение об ошибке «использование неназначенной локальной переменной« homeAdd ».

Client client = new Client(firstN, lastN, homeAdd, workAdd, email, homeP, cellP);

Есть ли простой способ, которым я могу выполнить проверку, которая мне нужна, и все еще использовать переменную?

Заранее спасибо, ребята / девочки.

Ответы [ 10 ]

4 голосов
/ 28 октября 2011

Измените всю строку else if на просто:

else

Два условия являются точными противоположностями. Ваш код будет работать (но многословно) в теории, при условии, что текстовое поле касается только потока пользовательского интерфейса. Однако компилятор не может подтвердить это.

3 голосов
/ 28 октября 2011

Первое, что вы должны сделать в этой ситуации, это потренироваться , почему компилятор жалуется. Очевидно, он думает, что есть какой-то способ выполнить ни из этих назначений. Теперь иногда это потому, что компилятор "тупой" (или, скорее, потому что языковой дизайн не достаточно мощный, чтобы заметить, когда вы рассмотрели все возможные случаи). Однако обычно это потому, что вы что-то упустили или сделали предположение, которое компилятор не хочет делать.

Вы сделали предположение, что значение homeAddressText.Text останется неизменным между двумя вызовами (что не обязательно верно) и , что != и == будут давать обратные ответы когда даны те же самые операнды (что является более разумным допущением, но компилятор не сделает). Фактически, компилятор даже не пытается быть умным здесь - он рассматривает только каждое условие отдельно, поэтому даже это не компилируется:

// Local variable - can't possibly change...
int x = ...;
int y;
if (x == 5)
{
    y = 1;
}
else if (x != 5) // The compiler *could* realize this is the inverse...
{
    y = 2;
}
Console.WriteLine(y);

В конечном счете, язык не станет более сложным, чтобы позволить вам писать избыточный код - лучше , чтобы заставить вас удалить избыточность.

Итак, как мы можем избежать этого? Как мы можем дать понять компилятору и любым будущим читателям, что мы определенно выберем тот или иной курс? Мы можем просто удалить условие второго варианта:

if (homeAddressText.Text == String.Empty)
{
    homeAdd = " ";
}
else
{
    homeAdd = homeAddressText.Text;
}

Теперь мы, очевидно, возьмем первую ветвь или вторую, поскольку в этом весь смысл блока else. Тем не менее, теперь у нас есть шаблон:

if (condition)
{
    variable = expression1;
}
else
{
    variable = expression2;
}

и лично Мне нравится использовать условный оператор в таких ситуациях - это делает всю цель "Я хочу присвоить значение переменной на основе условия" более явным:

variable = condition ? expression1 : expression2;

Так что в этом случае ваш код будет выглядеть так:

homeAdd = homeAddressText.Text == String.Empty ? " " : homeAddressText.Text;

Теперь, возможно, я бы оставил это, но было бы хорошо , если бы мы могли упомянуть homeAddressText.Text один раз . Если вы делаете это регулярно, возможно, вы захотите написать метод расширения:

public static string DefaultIfNullOrEmpty(this string input, string defaultValue)
{
    return string.IsNullOrEmpty(input) ? defaultValue : input;
}

Тогда ваше назначение становится:

homeAdd = homeAddress.Text.DefaultIfNullOrEmpty(" ");

Это очень явно относится к ситуациям, в которых используется значение по умолчанию (например, оно не по умолчанию, если у вас только что есть пробел), но если краткость важнее для вас, вы можете переименовать это:

homeAdd = homeAddress.Text.OrDefault(" ");
2 голосов
/ 28 октября 2011

Это должно сработать, если я правильно понял вашу проблему.

string homeAdd = " "; //initialize to the default value
if(!String.IsNullOrEmpty(homeAddressText.Text))
{
   homeAdd = homeAddressText.Text;
}
1 голос
/ 28 октября 2011

Используйте это, чтобы сделать все простым и коротким.но немного толстый:)

string homeAdd = homeAddressText.Text == String.Empty ?  " " :  homeAddressText.Text;
1 голос
/ 28 октября 2011

Просто измените на:

string homeAdd;
if(homeAddressText.Text == String.Empty)
{
    homeAdd = " ";
}
else
{
    homeAdd = homeAddressText.Text;
}

Вам не нужен второй, если, как вы знаете, это правда, если он туда доберется. Компилятор достаточно умен, чтобы знать, что переменная будет инициализирована, если она назначена в каждом из предложений if и else, но не настолько умен, чтобы знать, что второе if всегда верно (в вашем случае).

0 голосов
/ 28 октября 2011

В вашем коде, если вы используете что-то другое, если, иначе, ваша проблема будет решена.

Здесь я публикую демонстрационный код, который я сделаю, если у меня возникнет такая проблема.1004 *

Надеюсь, это поможет вам.Спасибо.

0 голосов
/ 28 октября 2011

Вы можете попробовать вот так:

   string homeAdd = String.Empty;
    if (homeAddressText.Text != String.Empty)
    {
        homeAdd = homeAddressText.Text;
    }
0 голосов
/ 28 октября 2011
string homeAdd = " ";
if (homeAddress.Text != String.Empty) {
    homeAdd = homeAddress.Text;
}
0 голосов
/ 28 октября 2011

Удалить второе условие if.

Даже если ваши условия взаимоисключающие, компилятор не выглядит так уж далеко. Более того, проблемы многопоточности теоретически могут привести к изменению значения homeAddressText.Value. Таким образом, компилятор (правильно) предполагает, что существует вероятность того, что оба условия вернут false, в этом случае homeAdd действительно не инициализировано.

0 голосов
/ 28 октября 2011

Простой способ сделать это - сделать:

string homeAdd = string.IsNullOrEmpty(homeAddressText.Text) ? " " : homeAddressText.Text;

для вашей инициализации homeAdd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...