上代码:
private static RedisKey BasketKeyPrefix = "/basket/"u8.ToArray();
在查看Eshop源码的过程中,在Basket.API项目中能找到上面这句代码,刚看到时有点蒙圈,u8是个啥?它表示什么意思?
查了一下,最终才搞明白!点个小关👇,我来揭晓答案。
u8后缀
u8是C# 11的一个新后缀,用来表示文本的值是UTF-8类型,后缀不区分大小写,UTF-8是一种通用的字符编码,它可以支持多种语言和符号。使用u8后缀的好处是可以提高性能和内存效率,避免在运行时进行编码转换和分配内存。
由来动机
在.NET堆栈中使用UTF8是必要的,虽然大部分数据都以字节的形式来自网络堆栈,但在代码中仍然大量使用常量。例如,网络堆栈通常必须编写诸如:
"HTTP/1.0\r\n"" AUTH""Content-Length: "
过去没有有效的语法来执行此操作,因为C#使用UTF16编码表示所有字符串。这意味着开发人员必须在运行时编码的便利性和手动转换字节并存储在byte[]中做出选择,包括在启动时实际执行编码操作所花费的时间,后者会产生开销,这是C#中一个经常出现的痛点。
为了解决这个问题,允许在语言中使用UTF8文字,并在编译时将它们编码到UTF8中,于是u8诞生。
当你使用u8后缀时,文本的值是包含字符串的UTF-8字节表示形式。例如,下面的代码会创建一个包含5个字节的ReadOnlySpan<byte>,它表示了"Hello"这个字符串的UTF-8编码:
var hello = "Hello"u8;
其它后缀
除了u8,C#还支持其他几种后缀,也是我们很常用的,它们分别是:
F或f:表示float类型,也就是单精度浮点数。例如,
float x = 3.14F;
。D或d:表示double类型,也就是双精度浮点数。例如,
double x = 3.14D;
。M或m:表示decimal类型,也就是高精度的十进制数。例如,
decimal x = 3.14M;
。U或u:表示uint类型,也就是无符号的32位整数。例如,
uint x = 100U;
。L或l:表示long类型,也就是有符号的64位整数。例如,
long x = 100L;
。
参考文档:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-11.0/utf8-string-literals
👇感谢阅读,点赞+分享+收藏+关注👇
文章出自猿惑豁微信公众号