Возможно ли иметь переключатель в C#, который проверяет, является ли значение нулевым или пустым не "", а String.Empty? Я знаю, что могу это сделать:
switch (text)
{
case null:
case "":
break;
}
Есть ли что-нибудь получше, потому что я не хочу иметь большой список операторов IF?
Я пытаюсь заменить:
if (String.IsNullOrEmpty(text))
blah;
else if (text = "hi")
blah
Таких нет. То же самое и на уровне содержания. Ссылка другая. String.Empty всегда возвращает один и тот же экземпляр, а "" возвращает другой экземпляр.
Я уверен, что два "" на самом деле будут одним и тем же объектом, поскольку .net обрабатывает строки, но не положительно. object.ReferenceEquals указывает, что они одинаковы.
Мой тест согласуется с тестом Джоша - буквальная пустая строка "" относится к тому же объекту, что и String.Empty. Я не уверен, что это гарантировано каким-либо стандартом (хотя интернирование литералов гарантировано - не уверен, применяется ли эта гарантия к String.Empty), но это определенно то, что происходит сейчас.
Теперь вопрос ... а что, если он находится в отдельной сборке или в отдельных методах / классе / и т. д. Лично. Я использую String.Empty, потому что он более читабелен, чем "".





как насчет
if (string.isNullOrEmpty(text))
{
//blah
}
else
{
switch (text)
{
case "hi":
}
}
Вопрос состоял в том, чтобы избежать операторов if-else.
Если вы посмотрите на историю редактирования, исходный вопрос не содержал ничего о том, если еще ;-)
Также это позволяет избежать стиля предложений if, о которых он беспокоился, только с одним if else, а не с if elseif elseif и т. д.
Я бы предложил примерно следующее:
switch(text ?? String.Empty)
{
case "":
break;
case "hi":
break;
}
Это то, что вы ищете?
Из документацияString.Empty:
The value of this field is the zero-length string, "".
Я интерпретирую это как то, что нет разницы между "" и String.Empty. Почему вы пытаетесь их различать?
Я не был уверен, что существует разница между "" и String.Empty в отношении культуры (unicode ascii и т. д.).
Что не так с вашим примером оператора switch?
switch (text)
{
case null:
case "":
foo();
break;
case "hi":
bar();
break;
}
Он работает (и почему-то меня это удивило - я думал, что он будет жаловаться или вылетит на корпусе null), и все понятно.
В таком случае, почему вы беспокоитесь о String.Empty? Я кое-что упустил.
Пустая строка - это «», что равно String.Empty. Причина, по которой вы может помещаете "" в оператор case, но не "String.Empty", заключается в том, что "Empty" - это поле класса "String", а "" на самом деле является постоянным значением.
Допускаются постоянные значения в случаях, String.Empty - это поле, которое может быть изменено во время выполнения. (В этом случае он останется прежним, но не все статические поля каждого класса являются постоянными значениями.)
В случае «если» это условие оценивается во время выполнения, и если нет требует постоянного значения.
Надеюсь, это объясняет, почему.
Я только что заметил, что вы можете объедините операторы if / else и switch! Очень полезно, когда нужно проверить предварительные условия.
if (string.IsNullOrEmpty(text))
{
//blah
}
else switch (text)
{
case "hi":
Console.WriteLine("How about a nice game of chess?");
break;
default:
break;
}
Кто-то указал в соответствующем сообщении на SO, что на самом деле это не объединение операторов, но предложение else просто без фигурных скобок, поэтому переключатель является единственным выполненным оператором. Синтаксически это то же самое, что и ответ Джоша. Я действительно думаю, что это выглядит неплохо.
string StrMode;
if (!string.IsNullOrEmpty(StrMode))
{
switch (StrMode.Trim())
{
case "Souse":
{
//Statement Eg:
MesssageBox.Show("Souse");
break;
}
case "Company Agent":
{
//Statement Eg:
MesssageBox.Show("Souse");
break;
}
default:
return;
}
}
Я не знал, что есть разница между String.Empty и "". Какая разница?