引入了一项次要重大更改,仅影响格式错误的编码有效负载。
在 .NET 9 之前,使用 BinaryReader.ReadString() 分析的格式错误的编码字符串 [0x01, 0xC2]
返回了空字符串。
从 .NET 9 开始,BinaryReader.ReadString() 返回 "\uFFFD",这是用于替换未知、无法识别或不可表示的字符的 REPLACEMENT CHARACTER
。 此更改仅影响格式错误的有效负载并符合 Unicode 标准。
旧行为
var ms = new MemoryStream(new byte[] { 0x01, 0xC2 });
using (var br = new BinaryReader(ms))
{
string s = br.ReadString();
Console.WriteLine(s == "\uFFFD"); // false
Console.WriteLine(s.Length); // 0
}
新行为
从 .NET 9 开始,相同的代码片段会为 s == "\uFFFD"
和 s.Length
生成不同结果,如代码注释中所示:
var ms = new MemoryStream(new byte[] { 0x01, 0xC2 });
using (var br = new BinaryReader(ms))
{
string s = br.ReadString();
Console.WriteLine(s == "\uFFFD"); // true
Console.WriteLine(s.Length); // 1
}
引入的版本
.NET 9 预览版 7
中断性变更的类型
此更改为行为更改。
更改原因
此更改是影响极少数方案的性能改进。
建议的操作
如果要保留在字符串末尾省略不完整字节序列的之前行为,请在结果上调用 TrimEnd("\uFFFD")
。