我们都知道在C#中无法将bool类型强制转换为int类型。我想使用位掩码查看true的二进制表示,但是我不能使用(bool & int)。我认为问题在于架构设计上的决策:"true即为真,不是任何不等于0的数字"(C++),我想知道这种架构的好处是什么?C语言中的true/false概念有什么问题吗?
在编程中,如果一个整数不能表示为true
或false
,那么对于程序员来说会更加清晰明了。
if (5 > 0)
比if(5)
更易于理解。
这也是为什么在switch语句中不允许“穿透”条件。因为这样太容易出错了。
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
虽然这样写很简洁,但是它掩盖了代码片段的真实目的,其实本质上是“当我查看的字符不是空字符时循环”。可是书写的时候它只是说“在某些情况下将其视为布尔值,而在其他情况下将其视为数字”。
这种双重性质据称经常会导致问题,使代码难以阅读(因为您必须从上下文中判断所使用的 int 是用作int还是bool)。
如果你确实需要将布尔值用作整数,你可以使用
Convert.ToInt32(someBool)
如Noldorin提到的,或者你可以自己来实现。
someBool ? 1 : 0
这两个都清楚地表明你正在使用一个int
(而不是bool
)。
仅供参考,Convert.ToInt32(fooBool)
的结果会告诉你,true
表示为1,而 false
则为0。(这是BCL中的任意表示法,并不一定是在内存中使用的表示法。)
关键在于,位表示法对于任何程序员来说都应该是无意义的。布尔类型应该只用于特定的目的(即标志),不应与int混用,否则变量的使用可能会变得非常混乱。
我们可以使用Convert.ToInt32,它的定义如下:
public static int ToInt32(bool value);
int i = 0;
if (i = 1) {
...
}
这段代码在C#中甚至无法编译通过,但在C语言中虽然可以编译通过,但执行结果是错误的。
选择将C#作为强类型语言,给C#程序员带来了这些好处。即便如此,如果他们选择,也可以引入从bool到int(以及相反)的转换。我猜想他们没有这样做是因为可能会引入上述代码中的bug。
没有人喜欢受到其他实体的所有决策... 只需编写自己的转换器(快速且草率)
var n = (bool)your_int ? 1 : 0
int n = (bBool) ? 1 : 0
你提出了一个很好的观点。然而,它确实消除了一种捷径。
使用 C 语言可以轻松地通过代码 "bBool = 1 - bBool" 切换开关。
如果 bBool 是真(1),那么 1-1=0,bBool 变为 false。
如果 bBool 是假(0),那么 1-0=1,bBool 变为 true。
而在 C# 中,我需要进行条件判断来检查状态,然后将其设置为相反的状态,这会给机器和我自己带来更多的工作。
bBool = !bBool;
不就是你描述的功能吗? - Mark A. Donohoe使用 number != 0,容易出现错误。
C# 做了很多设计决策来避免这种常见错误的发生。