Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Hront
23 / 16 / 7
Регистрация: 03.02.2023
Сообщений: 93

Премудрости switch case

09.10.2024, 18:09. Показов 1142. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра!
Вопрос такой: Имеем
C#
1
2
3
4
5
6
7
8
9
    internal enum Directions
    {
        North,
        South,
        West,
        East,
        Up,
        Down
    }
и создаем выходы в комнатах:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
            foreach (XmlElement xExit in xRoom)
            {
                Directions dir = Directions.North;
                switch (xExit.GetAttribute("name"))
                {
                    case "north":
                        dir = Directions.North;
                        break;
                    case "south":
                        dir = Directions.South;
                        break;
                    case "west":
                        dir = Directions.West;
                        break;
                    case "east":
                        dir = Directions.East;
                        break;
                    case "up":
                        dir = Directions.Up;
                        break;
                    case "down":
                        dir = Directions.Down;
                        break;
                }
                if (int.TryParse(xExit.GetAttribute("index"), out var i)) 
                {
                    ex = new Exit(VNUM, i);
                    exits.Add(dir, ex);
                }
            }
Проблема в том, что не присвоить значение в строке 3 Directions dir = Directions.North нельзя будет ругаться на строке 28 что не присвоено значение. Null по дефолту тоже никак. И получаем, что если в кейсах не совпало, то будет то, что объявлено в начале (Directions dir = Directions.North) а это как бы.... фигня. Как быть хз...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2024, 18:09
Ответы с готовыми решениями:

Конструкция switch-case: сделать переменную из одного блока case доступной для других блоков
Помогите, пожалуйста, решить такую проблему. Есть у меня переменная a, которой задаётся значение в первом блоке case, причём а -...

Switch case с несколькими вариантами в одном Case
Нужно чтобы в конструкции Switch - case можно было несколько вариантов условия Switch засунуть в один Case Предполагаемый код (я думаю...

SWITCH-CASE

11
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
09.10.2024, 18:23
Лучший ответ Сообщение было отмечено Hront как решение

Решение

Когда просто маппинг нужен, то switch expression очень лаконичен:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Directions GetDirection(string direction) => direction switch
{
    "north" => Directions.North,
    "south" => Directions.South,
    "west" => Directions.West,
    "east" => Directions.East,
    "up" => Directions.Up,
    "down" => Directions.Down,
    _ => throw new ArgumentException("Invalid direction")
};
 
var dirEnum = GetDirection(xExit.GetAttribute("name"));
if (int.TryParse(xExit.GetAttribute("index"), out var i)) 
                {
                    ex = new Exit(VNUM, i);
                    exits.Add(dirEnum, ex);
                }
1
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
09.10.2024, 18:30
Цитата Сообщение от Hront Посмотреть сообщение
Проблема в том, что не присвоить значение в строке 3 Directions dir = Directions.North нельзя будет ругаться на строке 28 что не присвоено значение. Null по дефолту тоже никак. И получаем, что если в кейсах не совпало, то будет то, что объявлено в начале (Directions dir = Directions.North) а это как бы.... фигня. Как быть хз...
Вопрос в том, что вы ждете в случаях, когда в кейсах не совпало.
Для нулл делаете Directions? dir = null;
1
 Аватар для Hront
23 / 16 / 7
Регистрация: 03.02.2023
Сообщений: 93
09.10.2024, 19:26  [ТС]
IamRain, Cupko, Спасибо бааааальшое

Добавлено через 26 минут
IamRain,
Цитата Сообщение от IamRain Посмотреть сообщение
_ => throw new ArgumentException("Invalid direction")
требует обработать исключение.
Засунул в try cath.
Матюгнулся при если есть ошибка аж 8 раз(одно и то же), почему так?

Добавлено через 2 минуты
Цитата Сообщение от Cupko Посмотреть сообщение
Вопрос в том, что вы ждете в случаях, когда в кейсах не совпало.
просто не создавать, ну и предупредить по возможности.

Добавлено через 10 минут
Цитата Сообщение от Hront Посмотреть сообщение
Матюгнулся при если есть ошибка аж 8 раз(одно и то же), почему так?
Все допёр, спасиб.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 968
10.10.2024, 07:37
Цитата Сообщение от Hront Посмотреть сообщение
Проблема в том, что не присвоить значение в строке 3 Directions dir = Directions.North нельзя будет ругаться на строке 28 что не присвоено значение
вроде бы считается адекватной практикой в enum всегда добавлять первым полем 'none = 0' как раз для неинициализированных полей объектов и переменных. тогда далее просто в default в подобных ситуациях бросай исключение и в дебагере сразу будет очевидно, что проблема с неинициализированной переменной типа перечисление.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.10.2024, 08:09
Цитата Сообщение от golosalex Посмотреть сообщение
вроде бы считается адекватной практикой в enum всегда добавлять первым полем 'none = 0'
Когда как, если пишется конечный автомат, то None состояния может и не быть, что бы оно ни значило, поэтому не включают.
Например, есть уровень логирования None в Microsoft.Extensions.Logging.Abstraction s:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public enum LogLevel
  {
    /// <summary>
    /// Logs that contain the most detailed messages. These messages may contain sensitive application data.
    /// These messages are disabled by default and should never be enabled in a production environment.
    /// </summary>
    Trace,
    /// <summary>
    /// Logs that are used for interactive investigation during development.  These logs should primarily contain
    /// information useful for debugging and have no long-term value.
    /// </summary>
    Debug,
    /// <summary>
    /// Logs that track the general flow of the application. These logs should have long-term value.
    /// </summary>
    Information,
    /// <summary>
    /// Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the
    /// application execution to stop.
    /// </summary>
    Warning,
    /// <summary>
    /// Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a
    /// failure in the current activity, not an application-wide failure.
    /// </summary>
    Error,
    /// <summary>
    /// Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires
    /// immediate attention.
    /// </summary>
    Critical,
    /// <summary>
    /// Not used for writing log messages. Specifies that a logging category should not write any messages.
    /// </summary>
    None,
  }
А у Serilog-а нету:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public enum LogEventLevel
  {
    /// <summary>
    /// Anything and everything you might want to know about
    /// a running block of code.
    /// </summary>
    Verbose,
    /// <summary>
    /// Internal system events that aren't necessarily
    /// observable from the outside.
    /// </summary>
    Debug,
    /// <summary>
    /// The lifeblood of operational intelligence - things
    /// happen.
    /// </summary>
    Information,
    /// <summary>Service is degraded or endangered.</summary>
    Warning,
    /// <summary>
    /// Functionality is unavailable, invariants are broken
    /// or data is lost.
    /// </summary>
    Error,
    /// <summary>
    /// If you have a pager, it goes off when one of these
    /// occurs.
    /// </summary>
    Fatal,
  }
Добавлено через 5 минут
Цитата Сообщение от IamRain Посмотреть сообщение
есть уровень логирования None
При этом он явно не первый в списке, а наоборот максимальный.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 968
10.10.2024, 08:40
Цитата Сообщение от IamRain Посмотреть сообщение
Когда как, если пишется конечный автомат, то None состояния может и не быть, что бы оно ни значило, поэтому не включают.
не спорю. просто встречал где-то в сети такое мнение. мне лично запомнилось и иногда, где считаю удобным делаю так.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
10.10.2024, 12:00
Цитата Сообщение от golosalex Посмотреть сообщение
в enum всегда добавлять первым полем 'none = 0'
Есть такое, но встречается на самом деле реже чем кажется. Обычно первым полем идет какое-то значение по умолчанию.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
16.10.2024, 08:57
Hront,
А зачем тут вообще 'switch/case', если он используется чисто для сопоставления значений? Это ведь словарь:
C#
1
2
3
4
5
6
7
8
9
10
    private static readonly FrozenDictionary<string, Directions> _directionsMap = 
        new Dictionary<string, Directions>()
        {
            { "north", Directions.North },
            { "south", Directions.South },
            { "west", Directions.West },
            { "east", Directions.East },
            { "up", Directions.Up },
            { "down", Directions.Down },
        }.ToFrozenDictionary();
C#
1
2
3
4
5
6
7
    foreach (XmlElement xExit in xRoom)
    {
        if (_directionsMap.TryGetValue(xExit.GetAttribute("name"), out var direction))
        {
           //....
        }
    }
1
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 968
16.10.2024, 10:22
Цитата Сообщение от kotelok Посмотреть сообщение
А зачем тут вообще 'switch/case', если он используется чисто для сопоставления значений? Это ведь словарь:
кому как удобнее.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.10.2024, 20:06
Цитата Сообщение от kotelok Посмотреть сообщение
А зачем тут вообще 'switch/case', если он используется чисто для сопоставления значений? Это ведь словарь
В зависимости от конкретных условий, места применения компилятор может развернуть 'switch' по разному, оптимизируя под каждый случай.
В общем случае, словарь (а это всегда рантайм коллекция) будет проигрывать 'switch' по всем параметрам.

kolorotur: Во что разворачивается оператор switch?
2
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
17.10.2024, 07:25
Элд Хасп,
Ну, в целом да. Даже 'FrozenDictionary' (конкретно в данном случае) немного проигрывает.
Code
1
2
3
4
5
| Method                  | Mean     | Error    | StdDev   | Allocated |
|------------------------ |---------:|---------:|---------:|----------:|
| MapWithFrozenDictionary | 22.10 ns | 0.255 ns | 0.238 ns |         - |
| MapWithDictionary       | 27.18 ns | 0.151 ns | 0.126 ns |         - |
| MapWithSwitchCase       | 19.59 ns | 0.411 ns | 0.505 ns |         - |
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2024, 07:25
Помогаю со студенческими работами здесь

Switch case 'Ш'
Всем доброго дня! Как сделать case для русского введённого с клавиатуры символа?

Switch Case на байтах
byte str; foreach (byte b in str) { switch (b) { case &quot;???&quot;: ...

Оператор switch-case
Привет, друзья!) Такой вопрос: Можно ли создавать в глобальном switch-case несколько локальных switch-case в методе? Если да, то где...

Проблема со switch case
Есть такой код: switch(cmd) { case 777 : break; case 1: { MessageBox.Show(&quot;1&quot;); ...

Оператора switch / case
Локатор ориентирован на одну из сторон света ( «С» - север, «Ю» - юг, «З» - запад, «В» - восток) и может принимать три цифровые команды: 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru