Есть ли какая-либо значительная разница между использованием если/еще и случаем переключателя в C#?

[1171] Предупреждение: mysql_connect (): доступ запрещен для имени пользователя '@' host '[1171] [11108] Это предупреждение появляется при подключении к серверу MySQL / MariaDB с недопустимыми или отсутствующими учетными данными (имя пользователя / пароль). Таким образом, это обычно [1164] не [1164] проблема с кодом, а проблема конфигурации сервера. [11108] [11146] [1172] [11109] См. Справочную страницу в [1133] ${variablename} [1133] для примеров. [11109] [1172] [1173] [11110] Убедитесь, что вы действительно использовали кнопки [112] и [113]. [11110] [11177] [11154] Необычно, что вы получаете доступ без пароля - вот что произошло, когда Предупреждение: сказано [114]. [11154] [11155] [11111] Только локальный тестовый сервер обычно позволяет подключаться с именем пользователя [115], без пароля и с именем базы данных [116]. [11111] [11155] [11156] [11112] Вы можете проверить, действительно ли они [11142] исправлены [11142] с помощью клиента командной строки: [1159] [1159] [117] [11112] [11156] [11157] [11113] Имя пользователя и пароль [1165] с учетом регистра [1165] и пробел [1166] не [1166] игнорируется. Если ваш пароль содержит метасимволы, такие как [118], откройте их или поместите пароль в одиночные кавычки [1134] [1134]. [11113] [11157] [11158] [11114] Большинство хостинг-провайдеров предопределяют учетные записи mysql в отношении учетной записи пользователя unix (иногда просто префиксы или дополнительные числовые суффиксы). См. Документы для шаблона или документации, а также CPanel или любой другой интерфейс для установки пароля. [11114] [11158] [11159] [11115] См. Руководство по MySQL в [1135] Добавление учетных записей пользователей [1135] с помощью командной строки. При подключении к [1167] администратору [1167] вы можете выдать запрос, например: [1160] [1160] [119] [11115] [11159] [11160] [11116] Или использовать [1136] Администратор [1136] или [ 1137] WorkBench [1137] или любой другой графический инструмент для создания, проверки или исправления данных учетной записи. [11116] [11160] [11161] [11117] Если вы не можете исправить свои учетные данные, тогда запрос в Интернете «пожалуйста, помогите» не будет иметь никакого эффекта. Только у вас и вашего хостинг-провайдера есть разрешения и достаточный доступ для диагностики и исправления. [11117] [11161] [11177] [1173] [1182] [11118] Убедитесь, что вы [11143] могли достигнуть [11143] сервера базы данных, используя имя хоста, указанное вашим провайдером: [1161] [1161] [1110] [11118] [11178] ] [11162] [11119] Проверьте это с консоли SSH непосредственно на своем веб-сервере. Тестирование с вашего локального клиента разработки на ваш хостинг-сервер редко имеет смысл. [11119] [11162] [11163] [11120] Часто вы просто хотите, чтобы имя сервера было [1111], которое обычно использует локальный именованный сокет, когда он доступен. В других случаях вы можете попробовать [1112] как резерв. [11120] [11163] [11164] [11121] Если ваш сервер MySQL / MariaDB прослушивает другой порт, используйте [1113]. [11121] [11164] [11165] [11122] Если это не удается, тогда есть проблема с брандмауэром. [11122] [11165] [11178] [1182] [1187] [11123] При использовании констант [11144] [11144], таких как, например, [11144]. [1114] или [1115], убедитесь, что они на самом деле определены [1138] [1138]. [11123] [11179] [11166] [11124] Если вы получите [1116] и [1117], то это ваша проблема. [11124] [11166] [11167] [11125] Убедитесь, что ваш, например, [1118] был фактически включен и что угодно. [11125] [11167] [11179] [1187] [1190] [11126] Проверьте правильность установки [11145] [1139] [1119] [1139] разрешений [11145]. [11126] [11180] [11168] [11127] Недостаточно иметь пару [1120] + [1121]. [11127] [11168] [11169] [11128] Каждая учетная запись MySQL / MariaDB может иметь прикрепленный набор разрешений. [11128] [11169] [11170] [11129] Те могут ограничить, к каким базам данных вам разрешено подключаться, из которых клиент или сервер может возникнуть соединение и какие запросы разрешены. [11129] [11170] [11171] [11130] Предупреждение «Доступ запрещен» может также отображаться для вызовов [1140] [1122] [1140], если у вас нет прав на [1123] из определенной таблицы или [1124] / [1125], и чаще всего [1126]. [11130] [11171] [11172] [11131] Вы можете [1141] адаптировать разрешения учетной записи [1141] при подключении к каждому клиенту командной строки с помощью учетной записи администратора [1168] [1168] с запросом типа: [1162] [1162] [1127] [11131] [11172] [11180] [1190] [1196] [11132] Если предупреждение появляется сначала с помощью [1128], тогда у вас может быть [1142] php.ini-preconfigured учетной записи / пароля [1142]. [11132] [11181] [11173] [11133] Убедитесь, что [1129] и [1130] имеют значимые значения. [11133] [11173] [11174] [11134] Часто это конфигурация провайдера. Поэтому обратитесь к их поддержке несоответствий. [11134] [11174] [11181] [1196] [1199] [11135] Найдите документацию вашего хостинг-провайдера: [11135] [11182] [11175] [11136], например. [1143] HostGator [1143], [1144] GoDaddy [1144], [1145] 1 и 1 [1145], [1146] DigitalOcean [1146], [1147] BlueHost [1147], [1148] DreamHost [1148], [1149] ] MediaTemple [1149], [1150] ixWebhosting [1150], [1151] lunarhosting [1151] или просто google yours ». [11136] [11175] [11176] [11137] Еще раз обратитесь к своему провайдеру хостинга через свои каналы поддержки. [11137] [11176] [11182] [1199] [11102] [11138] Обратите внимание, что вы также можете [1169] исчерпать доступный пул соединений [1169]. Вы получите доступ к запрещенным предупреждениям для слишком большого количества параллельных подключений. [11138] [11102] [11103] [11139] Ваша версия клиента libmysql [1170] может быть несовместимой [1170] с сервер базы данных. Обычно MySQL и MariaDB-серверы можно получить с помощью PHP, скомпилированных в драйвере. Если у вас есть пользовательская настройка или устаревшая версия PHP, а также гораздо более новый сервер базы данных или значительно устаревший - тогда несоответствие версии может препятствовать подключению. (Нет, вам нужно исследовать себя. Никто не может угадать вашу настройку). [11139] [11103] [11146] [11140] Дополнительные ссылки: [11140] [11153] [11104] [1152] Serverfault: доступ к mysql запрещен для «root» @ «имя компьютера» [1152] [11104] [11105] [1153] Предупреждение : mysql_connect (): Access denied [1153] [11105] [11106] [1154] Предупреждение: mysql_select_db () Доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: НЕТ) [1154] [11106] [11107] [ 1155] Доступ запрещен для пользователя 'root' @ 'localhost' с PHPMyAdmin [1155] [11107] [11153]
[11141] Кстати, вы, вероятно, больше не хотите использовать функции [1156] [1131] [1156 ]. Новички часто мигрируют в [1157] mysqli [1157], что, однако, так же утомительно. Вместо этого прочитайте в [1158] PDO и подготовленные утверждения [1158]. [1163] [1163] [1132] [11141]
208
задан Community 23 May 2017 в 02:02
поделиться

15 ответов

Оператор переключения только производит тот же блок как IFS в режиме отладки или режиме эмуляции. В выпуске это будет скомпилировано в таблицу переходов (через оператор 'переключателя' MSIL) - который является O (1).

C# (в отличие от многих других языков) также позволяет включать строковые константы - и это работает немного по-другому. Это, очевидно, не практично для создания таблиц переходов для строк произвольных длин, таким образом, чаще всего такой переключатель будет скомпилирован в стопку IFS.

, Но если количество условий является достаточно большим для покрытия издержек, компилятор C# создаст объект HashTable, заполнит его со строковыми константами и сделает поиск на той таблице сопровождаемым переходом. Поиск хеш-таблицы не строго O (1) и имеет значимые постоянные затраты, но если количество маркировок случая будет большим, это будет значительно быстрее, чем по сравнению с каждой строковой константой в IFS.

Для подведения его, если количество условий - больше чем приблизительно 5, предпочитают, ПЕРЕКЛЮЧАЮТСЯ, ЕСЛИ, иначе используйте любые взгляды лучше.

323
ответ дан Sнаđошƒаӽ 23 November 2019 в 04:41
поделиться

Мой cs преподаватель предлагал не Вам операторы переключения с тех пор так часто, люди забыли повреждение, или используйте его неправильно. Я могу; t вспоминают точно, что он сказал, но что-то вдоль строк, что рассмотрение некоторой оригинальной кодовой базы, которая показала примеры оператора переключения (несколько лет назад) имело тонны ошибок в нем также.

0
ответ дан 23 November 2019 в 04:41
поделиться

Вопрос об интересе. Это подошло несколько недель назад на работе, и мы нашли ответ путем записи отрывка в качестве примера, и просматривая ее в Отражателе.NET (отражатель является потрясающим!! я люблю его).

Это - то, что мы обнаружили: допустимый оператор переключения для чего-либо кроме строки компилируется в IL как оператор переключения. Однако, ЕСЛИ это - строка, это переписывается как если/еще если/еще в IL. Таким образом в нашем случае мы хотели знать, как операторы переключения сравнивают строки, например, чувствительно к регистру и т.д., и отражатель быстро дал нам ответ. Это было полезно для знания.

, Если Вы хотите сделать чувствительный к регистру, выдерживают сравнение на строках тогда, Вы могли использовать оператор переключения, поскольку это быстрее, чем выполнение Строки. Сравните в если/еще. (Редактирование: Считайте , Что более быстро, включите строку или elseif на типе? для некоторых фактических тестов производительности) Однако, если Вы хотели сделать нечувствительное к регистру тогда, это лучше использует, если/еще, поскольку получающийся код не симпатичен.

switch (myString.ToLower())
{
  // not a good solution
}

лучшее эмпирическое правило должно использовать операторы переключения, если оно имеет смысл (серьезно), например:

  • это улучшает удобочитаемость Вашего кода
  • , Вы сравниваете диапазон значений (плавание, интервал) или перечисление

, Если необходимо управлять значением для питания в оператор переключения (создайте временную переменную для переключения против), тогда, вероятно, необходимо использовать, если/еще проверяют утверждение.

обновление:

на самом деле лучше преобразовать строку в верхний регистр (например, ToUpper()), как это было, по-видимому, существует дальнейшая оптимизация, которую своевременный компилятор может сделать как тогда, когда по сравнению с ToLower(). Это - микро оптимизация, однако в жестком цикле, это могло быть полезно.

<час>

Немного примечания стороны:

Для улучшения удобочитаемости операторов переключения пробуют следующее:

  • помещает наиболее вероятное ответвление сначала т.е. наиболее полученный доступ
  • , если они все вероятны произойти, перечислить их в алфавитном порядке, таким образом, легче найти их.
  • никогда не используют вместилище по умолчанию для последнего остающегося условия, это лениво и вызовет проблемы позже в жизни кода.
  • используют вместилище по умолчанию для утверждения неизвестного условия даже при том, что это очень вряд ли оно будет когда-либо происходить. именно это утверждает, хороши для.
1
ответ дан Community 23 November 2019 в 04:41
поделиться

Не только C#, но и все языки на базе С, я думаю: потому что переключатель ограничен константами, возможно генерировать очень эффективный код с помощью "таблицы переходов". Случай C является действительно вычисленным GOTO старого доброго ФОРТРАНА, но случай C# является все еще тестами против константы.

Не то, что оптимизатор будет в состоянии сделать тот же код. Рассмотрите, например,

if(a == 3){ //...
} else if (a == 5 || a == 7){ //...
} else {//...
}

, поскольку те - составные булевские переменные, сгенерированный код должен вычислить значение и короткое замыкание. Теперь рассмотрите эквивалент

switch(a){
   case 3: // ...
    break;
   case 5:
   case 7: //...
    break;
   default: //...
}

, Это может быть скомпилировано в

BTABL: *
B3:   addr of 3 code
B5:
B7:   addr of 5,7 code
      load 0,1 ino reg X based on value
      jump indirect through BTABL+x

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

1
ответ дан Drew Noakes 23 November 2019 в 04:41
поделиться

Тема стороны, но я часто волнуюсь о (и чаще вижу) if / else и switch, оператор становится слишком большим со слишком многими случаями. Они часто повреждают пригодность для обслуживания.

Общие преступники включают:

  1. Выполнение слишком много в нескольких, если операторы
  2. [еще 114] операторы выбора, чем по-человечески возможный проанализировать
  3. Слишком много условий в, если оценка для знания, что ищется

Для фиксации:

  1. Извлечение к рефакторингу Метода.
  2. Использование Словарь с указателями метода вместо случая или использование МОК для добавленной конфигурируемости. Фабрики метода также могут быть полезными.
  3. Извлечение условия к их собственному методу
4
ответ дан Shog9 23 November 2019 в 04:41
поделиться

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

switch(variable)
{
   case someVariable
   break;
   default:
   break;
}

это должно быть

switch(variable)
{
  case CONSTANT_VALUE;
  break;
  default:
  break;
}
14
ответ дан kemiller2002 23 November 2019 в 04:41
поделиться

часто это будет выглядеть лучше - т.е. будет легче понять то, что продолжается. Рассмотрение выигрыша в производительности будет чрезвычайно минимально в лучшем случае представление кода является наиболее важным различием.

Так, если, если/еще взгляды лучше, используйте его, иначе используйте оператор переключения.

7
ответ дан gbjbaanb 23 November 2019 в 04:41
поделиться

Компилятор собирается оптимизировать в значительной степени все в тот же код с незначительными различиями (Knuth, кто-либо?).

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

Друзья не позволяют друзьям сложить если еще операторы.

15
ответ дан 23 November 2019 в 04:41
поделиться

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

В случае C#, это также верно, но по другим причинам.

С большим количеством строк, существует значительное преимущество производительности для использования оператора переключения, потому что компилятор будет использовать хэш-таблицу для реализации перехода.

С небольшим количеством строк, производительность между этими двумя является тем же.

Это вызвано тем, что в этом случае компилятор C# не генерирует таблицу переходов. Вместо этого это генерирует MSIL, который ЕЩЕ эквивалентен ЕСЛИ / блоки.

существует инструкция по MSIL "оператора переключения" это, когда jitted будет использовать таблицу переходов для реализации оператора переключения. Это только работает с целыми типами, однако (этот вопрос спрашивает о строках).

Для небольших чисел строк, более эффективно для компилятора генерировать, ЕСЛИ / ЕЩЕ блоки тогда это должно использовать хэш-таблицу.

, Когда я первоначально заметил это, я сделал предположение, что, потому что, ЕСЛИ / ЕЩЕ блоки использовались с небольшим количеством строк, что компилятор сделал то же преобразование для больших количеств строк.

Это было НЕПРАВИЛЬНО. 'IMA' был достаточно любезен, чтобы указать на это мне (хорошо..., он не был добр об этом, но он был прав, и я был неправ, который является важной частью)

, я также сделал возглавляемое предположение кости об отсутствии инструкции "по переключателю" в MSIL (я фигурировал, если там действительно ли переключатель был примитивен, почему они не были использующий его с хэш-таблицей, таким образом, не должно быть переключателя, примитивного....). Это было и неправильно, и невероятно глупо с моей стороны. Снова 'IMA' указал на это мне.

я сделал обновления здесь, потому что это - самое высокое расчетное сообщение и принятый ответ.

Однако я сделал его Сообществом Wiki, потому что я полагаю, что не заслуживаю ЧЛЕНА ПАЛАТЫ ПРЕДСТАВИТЕЛЕЙ для того, чтобы быть неправым. Если Вы получаете шанс, голосуете 'за сообщение ima.

52
ответ дан 7 revs 23 November 2019 в 04:41
поделиться

Три причины предпочесть switch:

  • компилятор А, предназначающийся для собственного кода, может часто компилировать оператор переключения в [1 117] один условный переход плюс косвенный переход , тогда как последовательность if с требует последовательность условных переходов . В зависимости от плотности случаев очень много изученных работ были написаны о том, как скомпилировать операторы выбора эффективно; некоторые связаны от lcc страница компилятора. (Lcc имел один из более инновационных компиляторов для переключателей.)

  • оператор переключения А , выбор среди взаимоисключающих альтернатив и синтаксис переключателя делает этот поток управления более очевидным для программиста тогда вложенное множество if-then-else операторов.

  • На некоторых языках, включая определенно ML и Haskell, проверки компилятора, чтобы видеть, не учли ли Вы какие-либо случаи . Я просматриваю эту функцию как одно из главных преимуществ ML и Haskell. Я не знаю, может ли C# сделать это.

история: в лекции он дал при получении премии за прижизненные достижения, я слышал, что Tony Hoare сказал ту из всех вещей, которые он сделал в своей карьере, было три, что он наиболее гордился:

  • Quicksort
  • Изобретения, Изобретающий оператор переключения (который Tony назвал case оператор)
  • Запуск и окончание его карьеры в промышленности

, я не могу предположить жить без switch .

18
ответ дан Norman Ramsey 23 November 2019 в 04:41
поделиться

Это на самом деле не отвечает на Ваш вопрос, но данный там будет мало различия между скомпилированными версиями, я убедил бы Вас записать свой код способом, который лучше всего описывает Ваши намерения. Мало того, что существует лучший шанс выполнения компилятора, что Вы ожидаете, но это облегчит для других поддерживать Ваш код.

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

, Если Ваше намерение состоит в том, чтобы перейти Ваша программа на основе различных переменных/атрибутов/условий, то, если/еще, если цепочка лучше всего представляет то намерение.

я допущу, что cody прав относительно людей, забывающих команду прерывания работы, но почти поскольку часто я вижу, что люди делают сложный, если блоки, где они добираются {} неправильно, так строки, которые должны быть в условном операторе, не. Это - одна из причин, которые I всегда включает {} в мой если операторы, даже если существует одна строка в нем. Мало того, что легче читать, но и если я должен добавить другую строку в условном выражении, я не могу забыть добавлять его.

2
ответ дан dj_segfault 23 November 2019 в 04:41
поделиться

Я только что заметил, что вы можете комбинировать операторы if / else и switch! Очень полезно при проверке предварительных условий.

if (string.IsNullOrEmpty(line))
{
    //skip empty lines
}
else switch (line.Substring(0,1))
{
    case "1":
        Console.WriteLine(line);
        break;
    case "9":
        Console.WriteLine(line);
        break;
    default:
        break;
}
0
ответ дан 23 November 2019 в 04:41
поделиться

Я не видел, чтобы кто-нибудь еще поднимал (очевидный?) Вопрос, что предполагаемое преимущество в эффективности оператора switch зависит от того, насколько вероятны различные случаи. В случаях, когда одно (или несколько) значений более вероятны, лестница if-then-else может быть намного быстрее, если сначала проверяются наиболее распространенные случаи:

Так, например:

if (x==0) then {
  // do one thing
} else if (x==1) {
  // do the other thing
} else if (x==2) {
  // do the third thing
}

vs

switch(x) {
  case 0: 
         // do one thing
         break;
  case 1: 
         // do the other thing
         break;
  case 2: 
         // do the third thing
         break;
}

Если x равен нулю в 90% случаев, код «if-else» может быть в два раза быстрее, чем код на основе переключателя. Даже если компилятор превратит "переключатель" в какой-то умный таблично-управляемый goto, это все равно будет не так быстро, как простая проверка на ноль.

12
ответ дан 23 November 2019 в 04:41
поделиться

The switch statement is definitely the faster then a if else if. There are speedtest that have been supplied on it by BlackWasp

http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

--Check it out

But depends heavily on the possibilities that you're trying to account for, but I try to use a switch statement whenever possible.

2
ответ дан 23 November 2019 в 04:41
поделиться

Если вы просто используете оператор if или else, базовым решением является использование оператора comparsion ?

(value == value1) ? (type1)do this : (type1)or do this;

Вы можете сделать процедуру or в switch

switch(typeCode)
{
   case TypeCode:Int32:
   case TypeCode.Int64:
     //dosomething here
     break;
   default: return;
}
3
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: