C# не может бросить bool к интервалу

Идея состоит в том, чтобы управлять значениями внутри объекта, состоянием, избегая коррупции и неправильного использования, вызывая код.

35
задан Andreas Niedermair 15 April 2015 в 11:52
поделиться

8 ответов

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

if (5> 0) легче понять, чем if (5)

По той же причине они не допускают провалов в операторах switch. Слишком легко ошибиться.

27
ответ дан 27 November 2019 в 06:55
поделиться

В языке C целые числа часто используются дважды как обычное число и логическое значение, например, для циклов, которые выполняются, пока определенное число не равно нулю. Это использование, которое явно имеет свои достоинства для краткого кода, как наивная подпрограмма strlen:

const char *s;
for (s = str; *s; ++s)
    ;
return (s - str);

, но, будучи коротким, оно маскирует истинную цель этого фрагмента, который, по сути, говорит: «цикл, в то время как символ, на который я смотрю, не является нулевым символом. ". Но записано это просто говорит: «относитесь к нему как к логическому, когда мне это нравится, и как к числу в некоторых других случаях».

Такая двойная природа якобы часто приводит к проблемам и делает код менее читаемым (поскольку вы должны судить по контексту, подразумевается ли данное использование int как int или bool ).

22
ответ дан 27 November 2019 в 06:55
поделиться

Для информации: Convert.ToInt32 (fooBool) должен сообщить вам, что true представлено 1, а false на 0. (Это произвольное представление в BCL, и не обязательно то, что использовало его память, однако.)

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

17
ответ дан 27 November 2019 в 06:55
поделиться

Я не думаю, что проблема в некоторой степени связано с истиной / ложью или 1/0, поскольку речь идет о решении сделать C # языком со строгой типизацией, а не языком со слабой типизацией. У строго типизированного языка есть много преимуществ (и некоторые недостатки). Одно из преимуществ состоит в том, что он уменьшает количество ошибок, связанных с неправильным использованием (или неправильным использованием) выражений.

Например,

int i = 0;
if (i = 1) {
   ...
}

даже не компилируется на C #, но он будет компилироваться и выполняться неправильно на C.

] Выбор сделать C # языком со строгой типизацией предполагает эти преимущества для программистов на C #. Даже в этом случае они могли бы ввести преобразование из bool в int (и обратно), если захотят. Я подозреваю, что они этого не сделали

5
ответ дан 27 November 2019 в 06:55
поделиться

Никому не нравится все из решения любой другой сущности ... просто напишите свой собственный конвертер (быстро - и - как грязно)

3
ответ дан 27 November 2019 в 06:55
поделиться

число! = 0 слишком подвержено ошибкам.

В C # было принято множество проектных решений, направленных на устранение типичных ошибок, к которым может привести эта ошибка.

-2
ответ дан 27 November 2019 в 06:55
поделиться

int n = (bBool)? 1: 0

-1
ответ дан 27 November 2019 в 06:55
поделиться

Вы правильно заметили. Однако это удаляет один ярлык.

В c, переключения можно легко сделать с помощью кода "bBool = 1 - bBool".

Если bBool истинно (1), то 1 - 1 = 0. bBool меняется на false.

Если bBool ложно (0), то 1 - 0 = 1. bBool меняется на true.

Вместо этого в C# я должен сделать условие для проверки состояния, а затем установить его в противоположное состояние, что вызывает больше работы для машины и для меня.

-2
ответ дан 27 November 2019 в 06:55
поделиться