Функция для проверки пустой строки / свойства?
У меня есть объект со свойствами (строки). Пример: объект пациента с весом, ростом.
Но когда свойство имеет значение 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, он будет выполнять для вас пустой оператор объединения.