为了账号安全,请及时绑定邮箱和手机立即绑定

什么时候在 C# 中使用“不安全的字符串修改”是安全的?

什么时候在 C# 中使用“不安全的字符串修改”是安全的?

C#
一只名叫tom的猫 2021-11-14 15:43:20
private const int RESULT_LENGTH = 10;public static unsafe string Encode1(byte[] data){    var result = new string('0', RESULT_LENGTH); // memory allocation    fixed (char* c = result)    {        for (int i = 0; i < RESULT_LENGTH; i++)        {            c[i] = DetermineChar(data, i);        }    }    return result;}public static string Encode2(byte[] data){    var chars = new char[RESULT_LENGTH]; // memory allocation    for (int i = 0; i < RESULT_LENGTH; i++)    {        chars[i] = DetermineChar(data, i);    }    return new string(chars); // again a memory allocation}private static char DetermineChar(byte[] data, int index){    // dummy algorithm.    return 'a';}这两种方法都根据一些特定的算法将字节数组编码为字符串。第一个创建一个字符串并使用指针写入单个字符。第二个创建一个字符数组并最终使用该数组来实例化一个字符串。我知道字符串是不可变的,并且多个字符串声明可以指向同一个分配的内存。此外,根据本文,除非绝对必要,否则不应使用不安全的字符串修改。我的问题: 什么时候使用 Encode1 示例代码中使用的“不安全字符串修改”是安全的?附注。我知道新的概念,如Span 和 Memory,以及string.Create方法。我只是对这个具体案例很好奇。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

最终,这是“安全”的唯一时间(在白话意义上,不是在unsafe某种意义上)是当您拥有字符串并且它尚未暴露给任何可能期望它是不可变的外部代码时。唯一常见的情况是当您正在构建一个新的string并且您不能GetString在 an 上使用这些方法时Encoding- 例如,因为源数据是不连续的并且可能跨越多个Encoder步骤。

所以基本上,显示的场景Encode1是分配一个string已知长度的 new ,然后立即覆盖字符数据是唯一合理的用法。一旦字符串在野外:让它保持不变。

但是,如果您甚至可以远程避免它:我会的。这在上下文中绝对有意义Encode1,但是......

一种需要特别小心的场景:实习字符串(常量、文字等);你不拥有这些


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信