Почему люди используют волшебные значения вместо пустого указателя в их коде?

$('#firstSelect' ).change(function(){
  var firstValue=$('#firstSelect').val();
  var subjects=['Select Subject', 'Maths', 'History', 'Computer Science'];
  var secondSelect = '<select name="whatever">';
  for (var i=0; i<subjects.length; i++)
  {
    if (firstValue!=subjects[i])
       {
         secondSelect += '<option value="' + subjects[i] + '">' + subjects[i] + '</option>';
       }
   }
  secondSelect += '</select>';
  document.getElementById('secondSelectDiv').innerHTML= secondSelect;
});

Есть много способов сделать это. Чтобы использовать метод выше, создайте первый раскрывающийся список или выберите. Рядом с ним сделать пустой div с идентификатором «secondSelectDiv». Вам не нужно показывать второй выбор при загрузке страницы, потому что вы не знаете, какими должны быть значения. При изменении первого выбора создайте второй выбор, пропустив значение первого в качестве опции. После того, как выбран HTML, просто поместите его в пустой div. Это имеет дополнительное преимущество: если вы просто измените первый выбор, второй автоматически обновится ... нет необходимости в кнопке минус. Вы также можете выполнить тот же процесс, используя createElement, если хотите создать узлы. Помните о чувствительности к регистру при сравнении предметов. Тематические значения должны точно совпадать при первом выборе и втором выборе / выпадающем меню.

$('#firstSelect' ).change(function(){
      var firstValue=$('#firstSelect').val();
      var subjects=['Select Subject', 'Maths', 'History', 'Computer Science'];
      var secondSelect = '<select name="whatever">';
      for (var i=0; i<subjects.length; i++)
      {
        if (firstValue!=subjects[i])
           {
             secondSelect += '<option value="' + subjects[i] + '">' + subjects[i] + '</option>';
           }
       }
      secondSelect += '</select>';
      document.getElementById('secondSelectDiv').innerHTML= secondSelect;
    });
#firstSelect, #secondSelectDiv{
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="firstSelect">
<option value="Select Subject">Select Subject</option>
<option value="Maths">Maths</option>
<option value="History">History</option>
<option value="Computer Science">Computer Science</option>
</select>
<div id="secondSelectDiv">
</div>

9
задан 10 revs, 5 users 83% 27 February 2009 в 10:50
поделиться

6 ответов

Поскольку иметь "пустое" значение, тип должен быть nullable. Это хорошо работает для ссылочных типов (любой класс, который Вы определяете и стандартная библиотека), и если Вы посмотрите, то Вы будете видеть, что люди действительно используют пустой указатель каждый раз, когда у них есть ссылочный объект без значения

Employee employee = Employees.Find("John Smith");
if(employee == null) throw new Exception("Employee not found");

Проблема прибывает при использовании типов значения как интервал, символ или плавание. В отличие от ссылочных типов, которые указывают на блок данных где-то в другом месте в памяти, эти значения хранятся и управляются встроенные (нет никакого указателя/ссылки).

Из-за этого, по умолчанию, типы значения не имеют нулевого значения. В коде Вы, если, для порожденного невозможно быть пустым (я на самом деле удивлен это даже полученное Вашим компилятором - Visual Studio, 2008 и вероятно 2005 привлечет зеленое подчеркивание и скажет Вам, что оператор всегда является ложью).

Для интервала, чтобы иметь нулевое значение, необходимо объявить это как nullable

int? parentID;

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

Так, надо надеяться, Вы понимаете, почему "волшебные значения" часто используются для представления пустого указателя с основными типами (типы значения). Это - просто большая проблема и часто большой хит производительности (поиск, что упаковка/распаковывание), для хранения этих типов значения как ссылки на значение, чтобы позволить им быть пустыми.

Править: Для дальнейшей ссылки об упаковке/распаковывании (что у Вас должен быть интервал == пустой указатель), см. статью в MSDN:

Упаковка и распаковывание (руководство по программированию C#)

Производительность

Относительно простых присвоений, упаковывая и распаковывая в вычислительном отношении дорогие процессы. Когда тип значения упаковывается, новый объект должен быть выделен и создан. До меньшего градуса бросок, требуемый для распаковывания, является также дорогим в вычислительном отношении. Для получения дополнительной информации посмотрите Производительность.

11
ответ дан 4 December 2019 в 10:05
поделиться

Работая над большим datawarehouses, я иногда использую эти 0 значений вместо этого если ноль, для вставки не нулевого значения в мой куб. у меня всегда есть 0 идентификаторов, соответствующих 'Неизвестному' значению во всех размерах, таким образом, у меня есть куб без нулевых значений.

главный интерес к нему состоит в том, чтобы иметь simplier и более эффективные запросы

2
ответ дан 4 December 2019 в 10:05
поделиться

Это часто привычки, разработанные при программировании в C. Много программистов C были бы испуганы при трате nullable ints, которые по крайней мере требуют всего дополнительного бита и возможно даже указателя. Это особенно плохо, когда Вы знаете, что значение будет положительным, и у Вас есть все пространство отрицательных величин для использования для флагов.-1 может означать не, набор,-2 может означать, что породил, даже не имеет смысла в контексте этого узла,-3 может означать, что узел имел родителя, который не мог обработать работу и оставленный на разгуле питья и никогда не замечался снова и т.д...

В мире C# чистота nullable ints (и их простая интеграция с RDMS's) наряду с компьютерами с 2 ГБ + RAM означает, что старые привычки C медленно умирают, но привычка - вторая натура.

4
ответ дан 4 December 2019 в 10:05
поделиться

Наличие несуществующего объекта может заставить исключения быть брошенными, тогда как коды ошибок (как "-1" случай возникновения отказов) не выдали бы исключение.

Это может быть очень важно на языках или приложениях, которые не обрабатывают исключения хорошо.

3
ответ дан 4 December 2019 в 10:05
поделиться

Типы значения Nullable не доступны на каждом языке/среде; Они были добавлены к.Net 2.0. Если Ваш унаследованный код является базирующимся .NET и был запущен с помощью 1,1 платформ, то ответ - то, что пустой указатель не был опцией в то время.

1
ответ дан 4 December 2019 в 10:05
поделиться

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

0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

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