Требуется неотрицательное число имя параметра count

У меня проблема выше, когда я пытаюсь снять пейнтбол в своей программе. Ниже приведен код класса (Paintballs).

Когда я отлаживаю программу, ошибка находится в строке метода getPoints "return myClick [hit]. Ниже моя форма1.

В form1 проблема находится в событии picturebox1_MouseClick . Переменная count я не был уверен, что я должен держать ее в 0 или 1. Пожалуйста, дайте мне знать. Спасибо

В Going Native 2013 говорить, комиссия предложила избегать целочисленных типов без знака
при указании переменных, которые «не могут быть отрицательными».

12:15: «Используйте целые числа со знаком, если вам не нужна арифметика с комплиментом 2 или немного
шаблон.»

12:55: «Используйте целые, пока у вас нет причин не делать этого.
вы играете с битовыми шаблонами и никогда не смешиваете подписанные и неподписанные. «

42:45: «Всякий раз, когда вы смешиваете числа со знаком и без знака, у вас возникают проблемы.
правила просто очень удивительны, и они появляются в коде в
странные места. Они очень сильно коррелируют с ошибками. когда
люди используют целые числа без знака, у них обычно есть причина.
причина будет что-то вроде «ну, это не может быть отрицательным» … Когда
вы думаете, что вы не можете иметь отрицательные числа, у вас будет кто-то, кто
инициализирует ваши неподписанные с -2, и думаю, что они получают -2. Просто
очень подвержен ошибкам. … Слишком много целочисленных типов. Там
слишком мягкие правила для их смешивания, и это главное
источник ошибок. Вот почему я говорю, будь как можно проще. использование
целые числа, пока вам действительно не нужно что-то еще. «

Это понятно, но нет никакого упоминания об альтернативах при разработке интерфейсов, которые должны принимать только положительные числа. Я мог бы документировать это:

Читайте также:  Как посмотреть статистику в инстаграм на фото

Я мог бы положиться на отладочные утверждения везде:

Что я действительно хотел бы, это указать его на уровне типа. Это более сильный контракт. Я хочу убедиться, что функция не может принимать отрицательное целое число. Здесь я обычно выбираю неподписанных, но, учитывая, что это нежелательная практика, каковы мои альтернативы?

Можно ли создать такой тип, чтобы удовлетворить ограничение значения?

Есть ли смысл делать это?

Решение

Причина, по которой наличие параметра unsigned ничего не решает, потому что передача отрицательного значения времени выполнения в такую ​​функцию ничего не проверяет. -1 будет переосмыслен как 4294967295 и программа продолжит молча.

Только если вы попытаетесь передать известную константу времени компиляции, будет выдано предупреждение.

Если вы хотите проверить каждый параметр, который вы передаете в свою функцию, даже во время выполнения, утверждение assert является самым простым способом.

Если вы хотите быть более нарядным и описательным, вы можете определить свой собственный тип positive которые бы:

  • позволяют молчать int (Понижение)
  • разрешить броски из int , но выполняя assert при этом (продвижение)
  • поддержка арифметических операций

Это определенно сделает ваш код «чище» с ясным намерением — но это гораздо больше кода.

Другие решения

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

Утверждения во время выполнения должны быть хорошими, так как вы можете удалить их из сборки выпуска. Это нормальная практика, даже в сложных кодах, например, из CGAL:

Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************** Текст исключения **************
System.ArgumentOutOfRangeException: Требуется неотрицательное число.
Имя параметра: count
в System.IO.BinaryReader.ReadBytes(Int32 count)
в BNKFileEditor.Bnk.GameFile.ReadSection(BinaryReader reader)
в BNKFileEditor.Bnk.BnkFileParser.ReadSection(BinaryReader reader)
в BNKFileEditor.Bnk.BnkFileParser..ctor(String filename)
в BNKFileEditor.Form1.OpenFileButton_Click(Object sender, EventArgs e)
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Читайте также:  Htc 10 evo характеристики

************** Загруженные сборки **************
mscorlib
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
————————————–—
BNKFileEditor
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///C:/Users/semsh/Downloads/194_194_BNK_File_Ed/BNKFileEditor.exe
————————————–—
System.Windows.Forms
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
————————————–—
System
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
————————————–—
System.Drawing
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
————————————–—
mscorlib.resources
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
————————————–—
System.Windows.Forms.resources
Версия сборки: 2.0.0.0
Версия Win32: 2.0.50727.8745 (WinRel.050727-8700)
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
————————————–—

************** Оперативная отладка (JIT) **************
Для подключения оперативной (JIT) отладки файл .config данного
приложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *