将char隐式转换为整数有什么好处?

时间:2013-02-11 10:36:52

标签: c# .net casting char implicit-conversion

出于好奇......

我发现了使用Char类型的令人讨厌的副作用,所以我想知道为什么设计师选择了类似的行为。 由于隐式转换,以下内容有效:

int x = 'A';

但是,以下内容对我来说有点混乱,因为容易引起误解:

int y = 'P' + 'Q';

由于字符串由字符组成,并且字符串的“总和”产生另一个字符串,为什么字符的“总和”应该给出不同的字符?

另一个更糟糕的是:

string s1 = 'H' + "ello"; //yields "Hello"
string s2 = 'H' + 'e' + "llo";  //yields "173llo"

所有这一切都是因为隐式转换。 我想知道这样做有什么好处,而不是强迫用户将字符显式“转换”为整数(反之亦然)。

也许是我的失明,但我看到的不仅仅是好处。

顺便说一下,已经存在一个与此主题相关的问题,但似乎没有人给出正确的理由,除了“他们决定如此”或“不是那么糟糕”。

Implicit Type cast in C#

提前非常感谢你。

2 个答案:

答案 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+时会发生以下情况:

  1. 为字符串1的长度加上字符串2的长度分配内存。
  2. 将字符串1复制到新分配的数组的前面。
  3. 将字符串2复制到新分配的数组的后面。
  4. 返回新字符串的实例。
  5. 这将发生两次,因此您将拥有一个临时字符串实例,强调垃圾收集器。由于这个例子非常简单,可能不会太多,但我也发现了很多代码样本的字符串:

    string sql = "SELECT " + c1 + ", " + c2 + 
        " FROM " + table + 
        " WHERE " + c1 + " = " + condition + ";";
    

    也许编译器会优化这段代码,但你不能依赖他。在这种情况下,我更喜欢在内部使用StringBuilder的{​​{1}}或至少String.Format的包装器。

    得出结论: 从字符到整数的隐式转换对于简化编码很有用,但在构建字符串或字符时,不应使用加号或减号运算符。

答案 1 :(得分:0)

尝试回答“为什么隐式升级到32位”部分:无论如何,CPU在其寄存器中以32或64位整数运行。这意味着硬件进行隐式升级。该语言试图不过多地抽象硬件。

那说,这可能很烦人。