Идея состоит в том, чтобы управлять значениями внутри объекта, состоянием, избегая коррупции и неправильного использования, вызывая код.
Программисту яснее, когда целое число не может использоваться для истина
или ложь
.
if (5> 0)
легче понять, чем if (5)
По той же причине они не допускают провалов в операторах switch. Слишком легко ошибиться.
В языке C целые числа часто используются дважды как обычное число и логическое значение, например, для циклов, которые выполняются, пока определенное число не равно нулю. Это использование, которое явно имеет свои достоинства для краткого кода, как наивная подпрограмма strlen:
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
, но, будучи коротким, оно маскирует истинную цель этого фрагмента, который, по сути, говорит: «цикл, в то время как символ, на который я смотрю, не является нулевым символом. ". Но записано это просто говорит: «относитесь к нему как к логическому, когда мне это нравится, и как к числу в некоторых других случаях».
Такая двойная природа якобы часто приводит к проблемам и делает код менее читаемым (поскольку вы должны судить по контексту, подразумевается ли данное использование int
как int
или bool
).
Для информации: Convert.ToInt32 (fooBool)
должен сообщить вам, что true
представлено 1, а false
на 0. (Это произвольное представление в BCL, и не обязательно то, что использовало его память, однако.)
Дело в том, что битовое представление действительно должно быть бессмысленным для любого программиста. Логические значения предназначены для использования в определенных целях (например, с флагами), и их не следует смешивать с целыми числами, иначе использование переменных потенциально может сбить с толку.
Я не думаю, что проблема в некоторой степени связано с истиной / ложью или 1/0, поскольку речь идет о решении сделать C # языком со строгой типизацией, а не языком со слабой типизацией. У строго типизированного языка есть много преимуществ (и некоторые недостатки). Одно из преимуществ состоит в том, что он уменьшает количество ошибок, связанных с неправильным использованием (или неправильным использованием) выражений.
Например,
int i = 0;
if (i = 1) {
...
}
даже не компилируется на C #, но он будет компилироваться и выполняться неправильно на C.
] Выбор сделать C # языком со строгой типизацией предполагает эти преимущества для программистов на C #. Даже в этом случае они могли бы ввести преобразование из bool в int (и обратно), если захотят. Я подозреваю, что они этого не сделали
Никому не нравится все из решения любой другой сущности ... просто напишите свой собственный конвертер (быстро - и - как грязно)
число! = 0 слишком подвержено ошибкам.
В C # было принято множество проектных решений, направленных на устранение типичных ошибок, к которым может привести эта ошибка.
Вы правильно заметили. Однако это удаляет один ярлык.
В c, переключения можно легко сделать с помощью кода "bBool = 1 - bBool".
Если bBool истинно (1), то 1 - 1 = 0. bBool меняется на false.
Если bBool ложно (0), то 1 - 0 = 1. bBool меняется на true.
Вместо этого в C# я должен сделать условие для проверки состояния, а затем установить его в противоположное состояние, что вызывает больше работы для машины и для меня.