什么';s隐式将char转换为整数的好处

本文关键字:转换 整数 char 什么 | 更新日期: 2023-09-27 17:58:34

只是出于好奇。。。

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

int x = 'A';

然而,以下内容让我有点困惑,因为很容易导致误解:

int y = 'P' + 'Q';

既然一个字符串是由字符组成的,而字符串的"answers"会产生另一个字符串,为什么字符的"总和"会产生不同的结果呢?

另一个更糟糕的:

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

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

也许是我的盲目,但我看到的是弊大于利。

顺便说一句,已经有一个问题与这个话题有关,但似乎没有人给出一个合理的理由,除了"他们决定了"或"没那么糟糕"。

C#中的隐式类型转换

事先非常感谢。

什么';s隐式将char转换为整数的好处

Basicly我在这里看到了一个好处,我不认为这是一个糟糕的设计决定。内部字符也可以是整数。基于等价表的数字和字符之间的转换称为编码

但是,在.NET中,字符和字符串是用unicode编码的。unicode中的前128个字符等于以前的ASCII编码。

如果您想将字符串转换为数字(或返回),当您假设字符也是数字时,这可以很容易地完成。想象一下这样的事情:

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. 返回新字符串的实例

这种情况将发生两次,因此您将有一个临时字符串实例,对垃圾收集器施加压力。由于这个例子很简单,它可能不多,但我也在许多代码示例中发现了这样的字符串:

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

也许编译器会优化这段代码,但你不能依赖他。在这种情况下,比起StringBuilder,或者至少是内部使用StringBuilderString.Format,我更喜欢包装器。

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

试着回答"为什么隐式提升到32位"部分:CPU在其寄存器中对32或64位int进行操作。这意味着硬件做了一个隐含的提升。该语言尽量不过分抽象硬件。

也就是说,这可能很烦人。