C# 11 中引入的 UTF-8 字符串字面量

UTF-8 编码的适用范围越来越广了,特别在 Web 编程中使用的非常多,因为 HTTP 协议默认的编码就是 UTF-8,现在大多数网站的编码也都变为 UTF-8 了 。

C# 中的字符串是 UTF-16 编码的。在 C# 11 之前,程序员要么将 UTF-8 转换为十六进制,导致代码冗长、不可读,而且容易出错;要么在运行时对字符串文本进行编码,牺牲程序性能。

 // 高效,但不直观,容易出错
 static ReadOnlySpan AuthWithTrailingSpace => new byte[] { 0x41, 0x55, 0x54, 0x48, 0x20 };
 WriteBytes(AuthWithTrailingSpace);
 
 // 编译时分配,但还是不够简洁
 static readonly byte[] s_authWithTrailingSpace = Encoding.UTF8.GetBytes("AUTH ");
 WriteBytes(s_authWithTrailingSpace);
 
 // 最简单,但性能很差
 WriteBytes(Encoding.UTF8.GetBytes("AUTH "));

对此,C# 11 打算引入 UTF-8 字符串字面量解决此问题。

 ReadOnlySpan span = "hello"u8;

以后,我们不再需要手动分配一个 byte[] 然后在里面一个一个硬编码我们需要的字符。

注意,span 是 ReadOnlySpan 类型,而不是 string 类型。这种解决方法很高效,因为字面量到 ReadOnlySpan 之间的转换是在编译期间完成的,不牺牲程序性能,同时也简化了语法。上述代码实际上是一个语法糖,等同于:

 ReadOnlySpan span = new ReadOnlySpan(new byte[] { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00 }).
                                Slice(0,5); 

所以说,这显然还不是一个彻底的解决方案。 dotnet 工作组也在讨论是否引入一个全新的 Utf8String 类型,但目前尚未确定。

UTF
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章