Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Это механизм упрощения безопасности.
По сути, он помогает защитить от атак типа CSRF, когда злоумышленник читает массив JavaScript (загружаемый как Json) с веб-сайта жертвы. Они могут сделать это, переопределив тип массива JavaScript. d
заставляет возвращенный Json не быть массивом и, таким образом, превращает Array в число бесполезных для атакующего.
См. это замечательное сообщение в блоге: http://haacked.com/archive/2008/ 11/20 / анатомо-в своем тонком-JSon-vulnerability.aspx
Конечные точки службы ASP.NET и WCF JSON фактически переносят их JSON в объект со свойством «d», чтобы обойти тонкий потенциальный недостаток безопасности при использовании JSON
blockquote>Phil Haack's сообщение на этом: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Это было введено из ASP.NET3.5. Если вы хотите, чтобы
msg
работал в обеих структурах до и после 3.5, просто попробуйте этот небольшой хак.var data = msg.hasOwnProperty("d") ? msg.d : msg;
Courtesy Dave Ward: Никогда не беспокоиться об ASP.NET AJAX .d снова