Убедитесь, что unsigned int / long всегда выполняется в проверенном контексте в C # - PullRequest
3 голосов
/ 05 мая 2010

Кто-нибудь находил странным, что контекст по умолчанию для uint и ulong не проверяется, а не проверяется, учитывая, что они предназначены для представления значений, которые никогда не могут быть отрицательными?

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

Существует ли существующий атрибут, который можно применить к любому классу / сборке, чтобы он всегда выполнял арифметические операции в проверенном контексте? Я думал о том, чтобы написать его сам (как аспект, использующий PostSharp), но было бы здорово, если бы он уже был.

Большое спасибо,

1 Ответ

4 голосов
/ 05 мая 2010

Я не вижу, что здесь отличается от целых чисел без знака по сравнению со знаковыми ... почему снижение значения от 0 до uint.MaxValue может быть лучше, чем снижение значения от int.MinValue до int.MaxValue?

Если вы хотите, чтобы вся сборка была скомпилирована с проверкой, просто используйте /checked (или /checked+, чтобы быть более явным) в командной строке или в Visual Studio, в свойствах проекта найдите вкладку Build, нажмите Дополнительно ... »и установите флажок« Проверка на арифметическое переполнение / переполнение ».

Я не верю, что есть способ сделать это только для определенного класса.

...