Код с неопределенным поведением в C#

Мятежник, 32 точки, конечно. Код со стилем!

мятежный http://img525.imageshack.us/img525/1584/ss42po1.jpg

50
задан angry person 7 December 2009 в 05:24
поделиться

5 ответов

Как уже упоминалось, практически все, что находится в «небезопасном» блоке, может привести к поведению, определяемому реализацией; злоупотребление небезопасными блоками позволяет вам изменять байты кода, составляющие саму среду выполнения, и поэтому все ставки отключены.

Угловой случай целочисленного деления имеет поведение, определяемое реализацией.

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

В C # есть ряд других ситуаций, когда мы вынуждены генерировать код, поведение которого определяется реализацией. Например, такая ситуация:

http://blogs.msdn.com/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx

Однако ситуации, в которых Безопасно, у корректной программы на C # поведение, определяемое реализацией, должно быть довольно редким.

40
ответ дан 7 November 2019 в 10:53
поделиться

Согласно документу ECMA-334 (стр. 473):

Программа, не содержащая появления модификатора unsafe не может выставлять неопределенные поведение.

Это продвигает «определяемое реализацией» к худшему, см. ответ Эрика Липперта.

11
ответ дан 7 November 2019 в 10:53
поделиться

Глядя на Wiki, можно сказать, что ситуации, в которых происходит неопределенное поведение, либо недопустимы, либо вызывают исключение в C #.

Однако в небезопасном коде неопределенное поведение, как я полагаю, возможно, так как это позволяет использовать указатели и т. д.

Изменить: похоже, я прав: http://msdn.microsoft.com/en-us/library/aa664771%28VS.71%29.aspx

Имеет пример неопределенного поведения в C #

12
ответ дан 7 November 2019 в 10:53
поделиться

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

0
ответ дан 7 November 2019 в 10:53
поделиться

В общем, я бы сказал №

Используйте автоматическую переменную перед ее инициализацией.

Все переменные должны быть инициализированы. Если не возникает исключение.

Деление на ноль

Выдается исключение.

Индексирование массива за пределами границ

Выдается исключение

Как указал Aequitarum Custos, вы можете использовать небезопасный код. Опять же, это не совсем C #, вы явно отказываетесь от среды C #.

-2
ответ дан 7 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

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