C#: Преимущество явного утверждения “небезопасного” / параметр компилятора

Вам просто нужно поместить функцию в событие keyup вашего поля запроса.

$(function() {
  function numHits(n, h) {
    var c, re = new RegExp(n, "g");
    c = (h.match(re) || []).length;
    return c;
  }
  $("#keyword-input").keyup(function(e) {
    e.preventDefault();
    $("#keyword-count").html(numHits($("#keyword-input").val(), $("#my-txt-area").val()));
  });
});
8
задан Inisheer 3 March 2009 в 17:36
поделиться

9 ответов

Существует интервью с Создателем C# Anders Hejlsberg, который затрагивает предмет здесь. В основном, точно что заявил @Marc Gravell: typesafety сначала, небезопасность явным объявлением.

Таким образом отвечать на Ваш вопрос: ничто в CLR не предотвращает его; это - идиома языка, разработанная, чтобы позволить Вам работать с перчатками безопасности при контакте с типами. Если Вы хотите снять перчатки, это - Ваш выбор, но необходимо сделать активный выбор для снимания перчаток.

Править:

Для разъяснения: Я знаю, каков "небезопасный" и "безопасный" код. Это - просто вопрос того, почему мы должны сделать всю дополнительную работу (хорошо, не ТАК очень дополнительный) только, чтобы смочь использовать эти функции.

Как упомянуто в интервью я связался, это было явное проектное решение. C# является по существу эволюцией Java и в Java, у Вас нет указателей вообще. Но разработчики хотели позволить указатели; однако, потому что C# обычно вводил бы Java-разработчиков, они чувствовали, что это будет лучшим если поведение по умолчанию быть подобным Java, т.е. никаким указателям, все еще позволяя использование указателей явным объявлением.

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

9
ответ дан 5 December 2019 в 05:57
поделиться

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

Это становится более примечательным с частичным доверием (дополнения и т.д.), но все еще ценно в обычном коде.

7
ответ дан 5 December 2019 в 05:57
поделиться

На самом деле CLR не делает требований вообще о / небезопасном переключателе или ключевом слове. На самом деле C++ / CLI (язык C++, который работает под CLR) не имеет такого / небезопасного переключателя, и указатели могут использоваться свободно на CLR.

Таким образом, я перефразировал бы Ваш вопрос как, "Почему C# требует использования/, небезопасных, прежде чем указатели смогут использоваться?" И ответ на тот вопрос столь же указан в других ответах, данных здесь: помочь пользователю принять сознательное решение потерять способность работать в чем-то меньшем чем режиме Full Trust на CLR. C++ фактически всегда требует Полного Доверия на CLR, и C# может каждый раз, когда Вы называете код, который требует Полного Доверия, или каждый раз, когда Вы используете указатели.

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

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

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

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

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

Думайте об этом с противоположной точки зрения: потому что это не отметило небезопасный, можно вывести, что большая часть кода "безопасна" по умолчанию. Таким образом что означает быть "безопасным"? Для кода .NET это включает (но может не быть ограничен):

  • Сборщик "мусора" может заняться бизнесом, как обычно.
  • Ссылки на определенный тип будут относиться к объектам того типа (или пустой указатель).
  • Код, как гарантируют, выполнит доверие/требования к защите .NET.
  • Код, как математически доказывают, не непосредственно касается памяти за пределами своего собственного AppDomain. Это может казаться тривиальным, но вообразить, есть ли у Вас несколько AppDomains в том же приложении. Программист может уверенно рассматривать их как логически отдельный.

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

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

Короче говоря.NET хочет, чтобы Вы заявили свое намерение.

Несомненно, компилятор мог вывести потребность в "небезопасном" флаге. Но разработчики хотят, чтобы это было преднамеренным решением.

Мне это сродни многим синтаксическим требованиям в C#:

  • никакой случай переключателя без повреждения
  • никакой уровень доступа "разделы" (такие как "общественность": маркер в C++)
  • никакие поля класса с помощью "var"

Шаблон - то, что Вы не должны перемещать или изменять одну вещь и непреднамеренно влиять на другого. В причине они хотят сохранить Вас от "стрельбы в себя в ноге".

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

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

Старшее значащее различие между безопасным и небезопасным кодом - то, что небезопасный код недостижим сборщиком "мусора" .NET. Автоматический GC является огромной частью жаргона .NET и, когда Вы идете вне его границ, Вы изменяете многое из того, что может быть принято о Вашем коде.

Указатели в особенности допускают создание объектов на "куче" без ссылок GC. Это приводит к другой превосходной причине потребовать, чтобы код был отмечен как "небезопасное". Это помогает сузить, куда утечка памяти прибывает из того, когда Вы понимаете, что у Вас есть тот.

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

Лелеяние хороших привычек и безопасности. Каждый раз, когда Вы используете небезопасный блок в блоке, разрешение NativeCode будет потребовано от стека. Это могло, конечно, быть сделано неявно, но мы не могли также просто удалить частное ключевое слово полностью? Я думаю, что хорошо вынудить разработчиков конкретно потребовать небезопасного кода, прежде чем они смогут использовать его.

1
ответ дан 5 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

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