Переключатель C# с String.IsNullOrEmpty

Возможно ли иметь переключатель в C#, который проверяет, является ли значение нулевым или пустым не "", а String.Empty? Я знаю, что могу это сделать:

switch (text)
{
    case null:
    case "":
        break;
}

Есть ли что-нибудь получше, потому что я не хочу иметь большой список операторов IF?

Я пытаюсь заменить:

if (String.IsNullOrEmpty(text))
    blah;
else if (text = "hi")
    blah

Я не знал, что есть разница между String.Empty и "". Какая разница?

recursive 11.01.2009 05:14

Таких нет. То же самое и на уровне содержания. Ссылка другая. String.Empty всегда возвращает один и тот же экземпляр, а "" возвращает другой экземпляр.

Maxime Rouiller 11.01.2009 05:26

Я уверен, что два "" на самом деле будут одним и тем же объектом, поскольку .net обрабатывает строки, но не положительно. object.ReferenceEquals указывает, что они одинаковы.

JoshBerke 11.01.2009 08:05

Мой тест согласуется с тестом Джоша - буквальная пустая строка "" относится к тому же объекту, что и String.Empty. Я не уверен, что это гарантировано каким-либо стандартом (хотя интернирование литералов гарантировано - не уверен, применяется ли эта гарантия к String.Empty), но это определенно то, что происходит сейчас.

Michael Burr 11.01.2009 18:44

Теперь вопрос ... а что, если он находится в отдельной сборке или в отдельных методах / классе / и т. д. Лично. Я использую String.Empty, потому что он более читабелен, чем "".

Maxime Rouiller 12.01.2009 20:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
5
19 937
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

как насчет

if (string.isNullOrEmpty(text))
{
   //blah
}
else
{
 switch (text)
 {
     case "hi":
 }

}

Вопрос состоял в том, чтобы избежать операторов if-else.

James Pogran 09.04.2009 18:49

Если вы посмотрите на историю редактирования, исходный вопрос не содержал ничего о том, если еще ;-)

JoshBerke 09.04.2009 22:29

Также это позволяет избежать стиля предложений if, о которых он беспокоился, только с одним if else, а не с if elseif elseif и т. д.

JoshBerke 09.04.2009 22:30
Ответ принят как подходящий

Я бы предложил примерно следующее:

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 и т. д.).

maxfridbe 11.01.2009 05:31

Что не так с вашим примером оператора 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 просто без фигурных скобок, поэтому переключатель является единственным выполненным оператором. Синтаксически это то же самое, что и ответ Джоша. Я действительно думаю, что это выглядит неплохо.

Even Mien 05.10.2009 17:30
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;
    }
}

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