出于好奇......
我发现了使用Char类型的令人讨厌的副作用,所以我想知道为什么设计师选择了类似的行为。 由于隐式转换,以下内容有效:
int x = 'A';
但是,以下内容对我来说有点混乱,因为容易引起误解:
int y = 'P' + 'Q';
由于字符串由字符组成,并且字符串的“总和”产生另一个字符串,为什么字符的“总和”应该给出不同的字符?
另一个更糟糕的是:
string s1 = 'H' + "ello"; //yields "Hello"
string s2 = 'H' + 'e' + "llo"; //yields "173llo"
所有这一切都是因为隐式转换。 我想知道这样做有什么好处,而不是强迫用户将字符显式“转换”为整数(反之亦然)。
也许是我的失明,但我看到的不仅仅是好处。
顺便说一下,已经存在一个与此主题相关的问题,但似乎没有人给出正确的理由,除了“他们决定如此”或“不是那么糟糕”。
提前非常感谢你。
答案 0 :(得分:1)
基本上我在这里看到了一个好处,我不相信这是一个糟糕的设计决定。内部字符也是整数。基于等价表的数字和字符之间的转换称为编码。
然而,在.NET中,字符和字符串是unicode encoded。 unicode中的前128个字符等于前ASCII encoding。
如果你想将一个字符串转换成一个数字(或后面),当你假设字符也是数字时,这可以很容易地完成。想象一下这样的事情:
char c = '1';
int i = Convert.ToInt32(c);
数字字符和数字表示之间的偏移总是 0x30 。在内部,现在可以编写如下内容:
int result = c - 0x30;
if (result < 0 || result > 9)
throw new InvalidCastException();
请注意,该示例适用于字符,因为1个字符只能容纳1个数字文字(0到9)。对于字符串,您还需要将字符的索引与10和结果相乘,并将其添加到整体结果值。
当然,这很像“引擎盖下”。但是对于练习来说,对于字符串或字符使用operator+
(或减号)是不好的设计。这也有另一个原因。想象一下以下代码:
string s1 = "Hello";
string s2 = " ";
string s3 = "World";
string helloWorld = s1 + s2 + s3;
调用operator+
时会发生以下情况:
这将发生两次,因此您将拥有一个临时字符串实例,强调垃圾收集器。由于这个例子非常简单,可能不会太多,但我也发现了很多代码样本的字符串:
string sql = "SELECT " + c1 + ", " + c2 +
" FROM " + table +
" WHERE " + c1 + " = " + condition + ";";
也许编译器会优化这段代码,但你不能依赖他。在这种情况下,我更喜欢在内部使用StringBuilder
的{{1}}或至少String.Format
的包装器。
得出结论: 从字符到整数的隐式转换对于简化编码很有用,但在构建字符串或字符时,不应使用加号或减号运算符。
答案 1 :(得分:0)
尝试回答“为什么隐式升级到32位”部分:无论如何,CPU在其寄存器中以32或64位整数运行。这意味着硬件进行隐式升级。该语言试图不过多地抽象硬件。
那说,这可能很烦人。