Функция для проверки пустой строки / свойства?

У меня есть объект со свойствами (строки). Пример: объект пациента с весом, ростом.

Но когда свойство имеет значение null, мой код завершается ошибкой, когда я пытаюсь его использовать, поскольку для свойства установлено значение null. Итак, что я пытаюсь сделать, это создать функцию, которая проверяет, является ли строка / свойство нулевым, и, если это так, установить для свойства значение "".

Я знаю, что могу сделать одно из следующих: if(string.isNullOrEmpty(Patient.weight)) Patient.weight = "";

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

Кто-нибудь может дать мне подсказку:(?

10 ответов

Решение

Лично я бы гарантировал, что эти свойства никогда не будут нулевыми, написав их так:

private string _Name = string.Empty;
public string Name
{
    get
    {
        return _Name;
    }
    set
    {
        _Name = value ?? string.Empty;
    }
}

Тем не менее, то, что вы ищете, вероятно, ?? оператор, также известный как оператор слияния нулей, как используется выше, в основном, это выражение:

x = y ?? z;

означает то же самое, что и это:

if (y != null)
    x = y;
else
    x = z;

и это не совсем так. В приведенном выше примере y оценивается дважды, чего не происходит с ?? оператор, так что лучшее приближение будет следующим:

var temp = y;
if (temp != null)
    x = temp;
else
    x = z;

Используйте нуль-объединяющий оператор:

string s = Patient.Name ?? string.Empty;

Так что если Patient.Name тогда ноль s будет установлен на пустую строку.

Что-то вроде этого?

public string EmptyIfNull(string value) 
{
    return value ?? String.Empty;
}

Ты можешь сделать myString ?? string.Empty, который дает вам строку, или string.Empty, если она равна нулю.

Ну, пустой оператор объединения звучит так, будто это ваш друг здесь:

string text = patient.Name ?? "";

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

Обратите внимание, что это не будет устанавливать свойство - но это не то, что вы говорите, что хотите в любом случае, в предложении:

В идеале, я хотел бы иметь функцию, которая может принимать строку (без сбоев, даже если она равна нулю) и просто возвращать либо значение (если оно не равно нулю), либо "", если оно равно нулю.

Это именно то, что делает код выше.

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

private String height = "";

вместо

private String height;

Кстати, вы должны хранить такие значения, как height а также weight как Double и не StringЕсли у вас нет веских причин не делать этого.

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

string a = null;
a = a ?? "womble";
// a now has the value "womble"

string b = "fluff";
b = b ?? "cabbage";
// b wasn't null, so it still has the value "fluff"

Если Вес и Рост являются целыми числами, они не могут быть нулевыми. Если ваш объект нулевой, и вы пытаетесь получить высоту веса нулевого объекта, то ваш код просто неверен. Если строка имеет значение null, то она напечатает нулевой символ.

Следующее очень элегантно:

if ( String.isNullOrEmpty(patient.weight) )
{
//DO STUFF HERE
}
else
{
//DO OTHER STUFF HERE
}

Пожалуйста, поймите, если пациент нулевой, вы даже не должны быть в этом блоке кода.

Если вы используете isNullOrEmpty, то делать следующее бессмысленно.

patient.weight = "";

Примечание автора

Я предполагаю, что не понимаю причину, по которой строка, являющаяся нулевой, вызовет проблему. Пункты об установке значения в пустую строку при инициализации, конечно, действительны.

Передайте привет оператору слияния.

Вы можете взять идею @Jon на шаг вперед, чтобы вам не пришлось беспокоиться об использовании?? везде:

Определите ваши методы доступа следующим образом:

private String m_name = null;
public String Name
{
    get { return m_name ?? String.Empty; }
    set { m_name = value; }
}

Везде, где вы обращаетесь к свойству Name, он будет выполнять для вас пустой оператор объединения.

Другие вопросы по тегам