Должен ли я использовать целые числа без знака для моих членов класса подсчета?
Ответ
Например, предположим, что класс
TList <T> = class
private
FCount : Cardinal;
public
property Count : Cardinal read FCount;
end;
Это имеет смысл, не так ли? Количество элементов, хранящихся в списке, не может быть отрицательным, так почему бы не использовать для него целочисленный тип без знака? Я думаю, что в целом это хороший принцип - всегда использовать наименее общий (то есть самый особенный) тип.
Теперь итерация по списку выглядит следующим образом:
for I := 0 to List.Count - 1 do
Writeln (List [I]);
Когда количество элементов, хранящихся в списке, равно нулю, компилятор пытается оценить
List.Count - 1
, что приводит к хорошему переполнению целочисленного значения (если быть точным). В сочетании с тем фактом, что отладчик не показывает подходящее место, где произошло исключение, мне было очень трудно его найти.
Позвольте мне добавить, что если у вас отключена проверка переполнения, то возникающие ошибки будет еще сложнее отследить, потому что тогда вы будете часто получать доступ к памяти, которая вам не принадлежит - и это приведет к неопределенному поведению.
Теперь я буду использовать обычные целые числа для всех моих участников, чтобы избежать подобных ситуаций.
Если это полная чушь, пожалуйста, укажите мне:)
(Я просто потратил час на отслеживание целочисленного переполнения в моем коде, поэтому я решил поделиться этим - большинство людей здесь, конечно, знают об этом, но, возможно, я смогу сэкономить кому-то время.)