Какой из них лучше? Если Else / Switch Case. Javascript [dубликат]

Вы можете использовать PInvoke для API Win32, например NetGetDcName , который вернет пустую / пустую строку для машины, не связанной с доменом.

Еще лучше NetGetJoinInformation [ ! d1], который явно укажет вам, если машина не установлена, в рабочей группе или в домене.

Используя NetGetJoinInformation Я собрал это, что сработало для меня:

  public class Test {public static bool IsInDomain () {Win32.NetJoinStatus status = Win32.NetJoinStatus.NetSetupUnknownStatus;  IntPtr pDomain = IntPtr.Zero;  int result = Win32.NetGetJoinInformation (null, out pDomain, out status);  if (pDomain! = IntPtr.Zero) {Win32.NetApiBufferFree (pDomain);  } if (result == Win32.ErrorSuccess) {return status == Win32.NetJoinStatus.NetSetupDomainName;  } else {throw new Exception («Ошибка получения информации о домене», новый Win32Exception ());  }}} внутренний класс Win32 {public const int ErrorSuccess = 0;  [DllImport («Netapi32.dll», CharSet = CharSet.Unicode, SetLastError = true)] public static extern int NetGetJoinInformation (строковый сервер, вне домена IntPtr, статус NetJoinStatus);  [DllImport («Netapi32.dll»)] public static extern int NetApiBufferFree (IntPtr Buffer);  public enum NetJoinStatus {NetSetupUnknownStatus = 0, NetSetupUnjoined, NetSetupWorkgroupName, NetSetupDomainName}}  

29
задан AP257 2 November 2010 в 22:21
поделиться

4 ответа

В инструкции switch оцененное значение выражения switch сравнивается с оцененными значениями случаев. Таким образом, значение raw_value (число) сравнивается с raw_value & gt; 10.0 (выражение сравнения) и raw_value & gt; 5.0 (выражение сравнения).

Итак, если одно из ваших выражений case не дает число, равное 11.0 , или вы используете выражение true , вы всегда получите случай по умолчанию.

Вместо этого используйте простой , если / else :

  var raw_value = 11.0;  if (raw_value & gt; 10,0) {height = 48;  ширина = 36;  } else if (raw_value & gt; 5.0) {height = 40;  width = 30;  } else {height = 16;  ширина = 12;  }  
24
ответ дан Gumbo 16 August 2018 в 01:30
поделиться
  • 1
    И без необходимости break , это так же чисто, как оригинал. – user 15 December 2010 в 23:25

Нравится это:

  var raw_value = 11.0;  switch (true) {case (raw_value & gt; 10.0): height = 48;  ширина = 36;  ломать;  case (raw_value & gt; 5.0): height = 40;  width = 30;  ломать;  default: height = 16;  ширина = 12;  }  

Выражения в операторе case будут оцениваться в true или false , и если это соответствует переключатель условие ... вуаля. [D5] default действует как else .

Бонус: вы можете инвертировать всю логику, просто заменив true на ] неверно . С помощью операторов if ... else if вам нужно будет редактировать каждое предложение if в отдельности.

98
ответ дан Cœur 16 August 2018 в 01:30
поделиться
  • 1
    Это должен быть правильный ответ, так как он делает то, что задал ОП в стиле. Тем не менее, мне было нелегко в первый раз, когда я увидел оператор switch (true). – Juan Mendes 15 December 2010 в 23:16
  • 2
    Рад помочь хотя бы одному человеку. :) – DanMan 17 December 2010 в 22:49
  • 3
    Вверх проголосовали и должны быть отмечены как ответ. Большинство программистов (или, может быть, только меня) с языком сервера exp. найти реализацию JS неинтуитивной. Это своего рода странное начало оцениваемого выражения и работа в обратном направлении! – Matthew Pitts 29 May 2014 в 23:53
  • 4
    Просто примечание. Это наглядный пример, чтобы не предполагать, что у парня с наиболее точками SO есть правильный ответ. – Isaac Pak 7 September 2016 в 13:44

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

function conditionalSwitch (значение, cond, callback / * cond , callback, cond, callback, ... * /) {for (var i = 1; i & lt; arguments.length; i + = 2) {if (arguments [i] (value)) {arguments [i + 1 ](стоимость); вернуть; }}} function test (val) {let width, height; conditionalSwitch (val, (val) = & gt; val & gt; 10, () = & gt; [высота, ширина] = [48,36], (val) = & gt; val & gt; 5, () = & gt; [высота , width] = [40, 30], // Default () = & gt; true, () = & gt; [height, width] = [16, 12]) console.log (ширина, высота); } test (4.9); // 12 16 тест (5.1); // 30 40 тест (10.1); // 36 48

1
ответ дан Juan Mendes 16 August 2018 в 01:30
поделиться
  • 1
    С такими вещами речь идет в основном о синтаксическом сахаре .... – Lodewijk 8 January 2015 в 15:35
  • 2
    Эмм, разве это не должно быть в кодефене или чем-то, в каком-то месте весело! Не вижу смысла в том, чтобы быть здесь ... – sij_a 22 December 2015 в 14:41
  • 3
    @sij_a И ты, спустя годы, там: D – Juan Mendes 21 May 2018 в 11:11

Нет, инструкция switch не работает так. Однако это утверждение не всегда проще. Например, версия switch принимает 15 строк:

  var raw_value = 11.0;  switch (raw_value) {case (raw_value & gt; 10.0): height = 48;  ширина = 36;  ломать;  case (raw_value & gt; 5.0): height = 40;  width = 30;  ломать;  default: height = 16;  ширина = 12;  ломать;  }  

и «long» if / else version only 11:

  var raw_value  = 11,0;  if (raw_value & gt; 10,0) {height = 48;  ширина = 36;  } else if (raw_value & gt; 5.0) {height = 40;  width = 30;  } else {height = 16;  ширина = 12;  }  

Итак, в вашем случае лучше использовать второй, чем первый ...

1
ответ дан romaintaz 16 August 2018 в 01:30
поделиться
  • 1
    Меньшие строки кода не объективно «лучше», так как «хороший код» является субъективным. Читаемость и простота понимания - два других фактора. Я бы добавил, что этот подход лучше ", если цель использует как можно меньше строк кода" – GrayedFox 27 October 2017 в 15:47
Другие вопросы по тегам:

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