我们都知道在C#中我们无法将bool转换为int.我想看看bitmask的二进制表示是什么,但我不能使用(bool&int)..我认为问题是架构设计"真实,不是任何数字!= 0"(C++)我想知道这种架构的好处是什么?C真/假概念有什么不好?
当一个整数不能用于true
或时,程序员更清楚false
.
if (5 > 0)
更容易理解而不是 if(5)
这也是为什么他们不允许在switch语句中出现条件的原因.犯错很容易.
在C中,整数经常被双倍地用作正常数和布尔值,例如在某个数字不为零时运行的循环.这是一个明显具有简洁代码优点的用途,就像一个天真的strlen例程:
const char *s; for (s = str; *s; ++s) ; return (s - str);
但是,虽然简短,但它掩盖了该片段的真正目的,它基本上表示"循环,而我正在看的角色不是空字符".但是写下来只是说"当我感觉它时将它当作一个布尔值,并在其他一些情况下作为一个数字".
据称这种双重性质经常导致问题,并且它使代码的可读性降低(因为你必须根据上下文判断a的给定用法int
是否意图为int
或bool
).
如果你绝对需要使用布尔值作为整数,你可以使用
Convert.ToInt32(someBool)
正如Noldorin提到的那样,或者随你自己推出
someBool ? 1 : 0
两者都清楚地表明你使用的是int
(而不是a bool
).
只是为了获取信息,Convert.ToInt32(fooBool)
应该告诉你true
由1和false
0表示.(这是BCL中的任意表示,但不一定是使用它的内存,但是.)
这里的要点是,对于任何程序员来说,位表示确实应该是没有意义的.布尔值用于特定目的(即标志),不应与int混合使用,否则变量的使用可能会变得非常混乱.
我不认为问题是关于真/假或1/0的问题,因为它决定使C#成为强类型语言而不是弱类型语言.对于强类型语言有许多好处(和一些缺点).其中一个好处是它可以减少因滥用(或错误使用)表达而导致的错误.
例如,
int i = 0; if (i = 1) { ... }
甚至不会在C#中编译,但它会在C中编译和执行不正确.
选择使C#成为一种强类型语言,可以为C#程序员带来这些好处.即便如此,如果他们愿意,他们也可以引入从bool到int(和back)的转换.我怀疑他们没有这样做,因为可能会引入上述错误.