Мы все знаем, что в С# мы не можем использовать bool для int. Я хотел посмотреть, что представляет собой двоичное представление true с битовой маской, но я не могу использовать (bool и int). Я думаю, что проблема в архитектуре: "true is true, а не любое число!= 0" (С++) и мне было интересно, какие выгоды от такой архитектуры? Что так плохо с концепцией C true/false?
С# не может использовать bool для int
Ответ 1
Более ясный для программиста, когда целое число не может использоваться для true
или false
.
if (5 > 0)
легче понять, чем if(5)
Это та же самая причина, по которой они не позволяют оспаривать условия в операторах switch. Это слишком легко сделать ошибку.
Ответ 2
В C целые числа часто используются дважды как нормальное число и булево, например, для циклов, которые работают, пока определенное число не равно нулю. Это использование, которое явно имеет свои достоинства для краткого кода, например, наивная последовательность строк:
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
но в то время как короткий он маскирует истинную цель этого фрагмента, который по сути говорит "цикл, пока персонаж, на который я смотрю, не является нулевым символом". Но записано это просто говорит: "относиться к нему как к логическому, когда мне это нравится, и как к числу в некоторых других случаях".
Такая двойная природа, как утверждается, часто приводит к проблемам, и делает код менее удобочитаемым (поскольку из контекста вы должны судить о том, предназначено ли данное использование int
как int
или bool
).
Если вам абсолютно необходимо использовать логическое значение как целое число, вы можете либо использовать
Convert.ToInt32(someBool)
как Noldorin упомянул или катитесь с помощью
someBool ? 1 : 0
В обоих из них четко сказано, что вы используете int
(а не bool
).
Ответ 3
Просто для информации Convert.ToInt32(fooBool)
должен сказать вам, что true
представляется 1 и false
на 0. (Это произвольное представление в BCL, но не обязательно используемое в нем память. )
Дело здесь в том, что представление бит действительно должно быть бессмысленным для любого программиста. Булевы предназначены для использования в определенных целях (т.е. Флаги) и не должны смешиваться с ints, иначе использование переменных потенциально может стать довольно запутанным.
Ответ 4
Я не думаю, что проблема связана с истинным/ложным или 1/0, поскольку речь идет о решении сделать С# строго типизированным языком, а не слабо типизированным языком. Существует много преимуществ (и некоторые недостатки) для строго типизированного языка. Одним из преимуществ является то, что он уменьшает количество ошибок из-за неправильного использования (или неправильного использования) выражений.
Например,
int i = 0;
if (i = 1) {
...
}
даже не будет компилироваться в С#, но он будет компилироваться и выполняться некорректно в C.
Выбрав С#, чтобы строго сформулированный язык передавал эти преимущества программистам на С#. Тем не менее, они могли бы ввести преобразование из bool в int (и обратно), если они захотят. Я подозреваю, что они этого не сделали из-за возможности появления ошибок, подобных выше.
Ответ 5
мы можем использовать Convert.ToInt32, его определение здесь:
public static int ToInt32(bool value);
Ответ 6
Никто не любит всех других решений сущностей... просто напишите свой собственный конвертер (быстрый & -dirty-like)
Ответ 7
Вы хорошо разбираетесь в этом. Однако он удаляет один ярлык.
С помощью c, переключатели могут быть легко выполнены с помощью кода "bBool = 1 - bBool".
Если bBool истинно (1), то 1 - 1 = 0. bBool изменяется на false.
Если bBool является ложным (0), то 1 - 0 = 1. bBool изменяется на true.
Вместо этого в С# я должен выполнить условие, чтобы проверить состояние, а затем установить его напротив, что вызывает больше работы для машины и меня.
Ответ 8
number!= 0, слишком подвержен ошибкам.
С# сделал множество дизайнерских решений, чтобы подорвать такие распространенные ошибки, как это может привести.
Ответ 9
int n = (bBool)? 1: 0