2009-06-03 33 views
33

Todos sabemos que en C# no podemos convertir bool a int. Quería ver cuál es la representación binaria de true con bitmask, pero no puedo usar (bool & int) .. Creo que el problema es la definición de arquitectura "true is true, not any number! = 0" (C++) y me preguntaba ¿cuáles son los beneficios de una arquitectura así? ¿Qué tiene de malo el concepto C verdadero/falso?C# no se puede transmitir bool a int

+2

favor ver (http://meta.stackexchange.com/questions [ "preguntas debe incluir‘etiquetas’en sus títulos?"]/19190/should-questions-include-tags-in-their-titles), donde el consenso es "no, no deberían". –

Respuesta

26

Es más claro para el programador cuando un entero no se puede usar para true o false.

if (5 > 0) es más fácil de entender en lugar de if(5)

Es la misma razón por la que no se permite la caída a través de condiciones en los estados de conmutación. Es muy fácil cometer un error.

+10

En realidad, no me gusta la forma en que se caen con las declaraciones de interruptor en C# MUCHO. Hay muchos casos en que es muy útil tener éxito. – Joseph

+5

@Joseph: Aún se permite el caso que sea el menos propenso a errores; puede fallar siempre que no haga ningún trabajo primero. Pero tener un caso fallido después de hacer otro "trabajo" no es fácil de mantener. –

+1

@Joseph: que sea útil no significa que no sea propenso a errores o que no sea fácil cometer errores. –

15

Sólo a título informativo, Convert.ToInt32(fooBool) debe decirle que true está representado por 1, y false por 0. (Se trata de una representación arbitraria en el BCL, y no necesariamente el que se utiliza la memoria, sin embargo.)

El punto aquí es que la representación de bits realmente no debería tener sentido para ningún programador. Los booleanos están destinados a ser utilizados para fines específicos (es decir, banderas), y no deben mezclarse con enteros, de lo contrario, los usos de las variables pueden llegar a ser bastante confusos.

-2

número! = 0, es muy propenso a errores.

C# tomó muchas decisiones de diseño para subvertir errores comunes como este puede conducir a.

+0

No estoy seguro de cuál es su punto. Tal vez podrías elaborar un poco más. – jpierson

+0

Al no permitir cosas como if (27) el lenguaje obliga a las personas a una sintaxis que es más confiable como: if (27 > 0)

+0

Ah, ahora veo que "número 1 = 0" es un fragmento directo de la publicación original. Quizás poner un poco más de contexto en su respuesta ayudará a los lectores a entender su punto. En su forma actual, no tiene sentido por sí mismo. En general, es mejor tener alguna forma de la pregunta original dentro de su respuesta, no necesita ser una cita directa sino una reformulación de la pregunta original. – jpierson

3

nadie le gusta todas las decisiones de cualquier otra entidad ... acaba de escribir su propio convertidor (Quick-& -dirty similar)

21

en C enteros son frecuentemente utilizados por partida doble como un número normal y un valor lógico, tales como para bucles que se ejecutan mientras un cierto número no es cero. Eso es un uso que claramente tiene sus méritos para el código conciso, como un ingenuo strlen rutina:

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

pero mientras lo enmascara cortos el verdadero propósito de ese fragmento, que esencialmente dice "bucle mientras que el personaje que estoy mirando es no el personaje nulo ". Pero escrito, solo dice "trátelo como booleano cuando me apetezca, y como número en algunos otros casos".

Esta especie de doble carácter supuestamente conduce con frecuencia a problemas y hace que el código menos legible (ya que se debe juzgar por el contexto si un uso determinado de un int pretende ser int o bool).

Si es absolutamente necesario utilizar un booleano como un número entero que puede utilizar

Convert.ToInt32(someBool) 

como Noldorin mentioned o hágalo usted mismo con

someBool ? 1 : 0 

Ambos de los cuales dice claramente que está utilizando una int (y no un bool).

5

No creo que el problema sea mucho sobre verdadero/falso o 1/0, ya que se trata de la decisión de hacer C# un lenguaje fuertemente tipado en lugar de un lenguaje débilmente tipado. Hay muchos beneficios (y algunos inconvenientes) para un lenguaje fuertemente tipado.Uno de los beneficios es que reduce los errores debido al mal uso (o uso incorrecto) de las expresiones.

Por ejemplo,

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

ni siquiera compilar en C#, pero será tanto compilar y ejecutar de forma incorrecta en C.

La elección de hacer C# un lenguaje fuertemente tipado infiere que estos beneficios Programadores C#. Aun así, podrían haber introducido una conversión de bool a int (y viceversa) si así lo desean. Sospecho que no lo hicieron debido a la posibilidad de que se introduzcan errores como el anterior.

+1

esto no tiene nada que ver con "strong-typeness". if (i = 1) es posible en C porque el operador de asignación devuelve un valor (útil si quiere hacer a = b = c = 5) por ejemplo, Python está fuertemente tipado Y la asignación es una declaración, y no "devuelve" nada. Entonces, hacer algo como "si a = 3:" es un error. Pero Python tiene una regla que dice "cualquier cosa tiene una interpretación booleana": colecciones vacías, 0, la cadena vacía es False, cualquier otra cosa es Verdadero, por lo que puedes hacer mylist = [] si mylist: algo – ZeD

+1

Sí, pero la razón por la que permite que el resultado de la asignación se use en este contexto es porque tiene un tipo débil. Casi con seguridad la intención es i == 1, que es un resultado booleano y en C# estaría permitido en ese contexto. Si C tuviera un tipado fuerte, el resultado de la asignación no se permitiría en este contexto, ya que está en C#. Tal como está, el resultado de la asignación es (erróneamente, en este caso) casualmente evaluado como booleano y así nace un error. – tvanfosson

-2

int n = (bBool)? 1: 0

+2

Esto no es un elenco –

+8

¡CASI tengo que votarte por el uso de la notación húngara, yuk! – jpierson

-1

Haces un buen punto en esto. Sin embargo, elimina un atajo.

Con c, se puede hacer fácilmente con el código "bBool = 1 - bBool".

Si bBool es verdadero (1), entonces 1 - 1 = 0. bBool cambia a falso.

Si bBool es falso (0), entonces 1 - 0 = 1. bBool cambia a verdadero.

En lugar de C#, tengo que hacer un condicional para verificar el estado, y luego configurarlo en su opuesto, lo que causa más trabajo para la máquina y para mí.

+16

¿Me falta algo? 'bBool =! bBool;' hace lo que describes, ¿no? – MarqueIV

4

podemos utilizar Convert.ToInt32, su definición está aquí:

public static int ToInt32(bool value); 
Cuestiones relacionadas