11

以前可能有人问过这个问题,但我找不到任何这样的帖子。是否有使用 ASCII 字符串的类?好处很多:

  1. 比较应该更快,因为它只是逐字节(而不是具有可变编码的 UTF-8)
  2. 内存高效,应该使用大字符串中大约一半的内存
  3. ToUpper()/ToLower() 的更快版本,它使用语言不变的查找表

Jon Skeet 编写了一个基本的AsciiString 实现并证明了 #2,但我想知道是否有人更进一步并完成了这样的课程。我确信会有用处,尽管通常没有人会采用这样的方法,因为所有现有的 String 函数都必须手动重新实现。String <> AsciiString 之间的转换会分散在各处,使原本简单的程序变得复杂。

有这样的课吗?在哪里?

4

2 回答 2

6

我想我会发布我努力实现所描述的系统的结果,该系统具有尽可能多的字符串支持和兼容性。它可能并不完美,但它应该为您提供一个不错的基础,以便在需要时进行改进。

ASCIIChar 结构和 ASCIIString 字符串隐式转换为它们的本地对应物,以便于使用。

OP 关于替换 ToUpper/Lower 等的建议已经以比查找列表更快的方式实现,并且所有操作都尽可能快速和内存友好。

抱歉无法发布源代码,太长了。请参阅下面的链接。

  • ASCIIChar - 替换 char,将值存储在字节而不是 int 中,并为字符串类提供支持方法和兼容性。实现可用于 char 的虚拟所有方法和属性。

  • ASCIIChars - 为每个有效的 ASCII 字符提供静态属性以便于使用。

  • ASCIIString - 替换字符串,将字符存储在字节数组中,并实现几乎所有可用于字符串的方法和属性。

于 2013-06-02T13:58:41.687 回答
-2

Dotnet 没有直接的 ASCII 字符串支持。字符串是 UTF16,因为 Windows API 仅适用于 ASCII(onr char - 一个字节)或 UTF16。Utf8 将是最好的解决方案(java 使用它),但 .NET 不支持它,因为 Windows 不支持。


Windows API 可以在字符集之间进行转换,但 Windows api 仅适用于 1 字节字符或 2 字节字符,因此如果您在 .NET 中使用 UTF8 字符串,则必须每次都转换它们,这会影响性能。Dotnet 可以通过 BinaryWriter/BinaryReader 或简单的 StreamWriter/StreamReader 使用 UTF8 和其他编码。

于 2013-06-01T20:54:53.843 回答