Подтвердить что ты не робот

С# не может использовать bool для int

Мы все знаем, что в С# мы не можем использовать bool для int. Я хотел посмотреть, что представляет собой двоичное представление true с битовой маской, но я не могу использовать (bool и int). Я думаю, что проблема в архитектуре: "true is true, а не любое число!= 0" (С++) и мне было интересно, какие выгоды от такой архитектуры? Что так плохо с концепцией C true/false?

4b9b3361

Ответ 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