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
,但是......
一种需要特别小心的场景:实习字符串(常量、文字等);你不拥有这些。
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消