GetBytes 函数如何工作?
How does the GetBytes function work?
我自己编写了 class 将 C# 标准基元转换为字节数组。
后来看了BitConverter
classsource,看看高手是怎么做的
我的代码示例:
public static byte[] getBytes(short value) {
byte[] bytes = new byte[2];
bytes[0] = (byte)(value >> 8);
bytes[1] = (byte)value;
return bytes;
}
BitConverter class代码:
public unsafe static byte[] GetBytes(short value)
{
byte[] bytes = new byte[2];
fixed(byte* b = bytes)
*((short*)b) = value;
return bytes;
}
为什么他们的函数被标记为不安全并使用固定运算符?
这样的函数即使使用了unsafe也容易出错吗?我应该放弃我的并使用他们的实现吗?哪个效率更高?
是的,放弃你的并使用标准库。
效率更高,因为它通过将字节数组转换为短指针来同时复制两个字节。为此,它需要 fixed 以允许使用指针,因此需要 unsafe 关键字。
在您自己的程序集中通常要避免使用不安全的代码,因为这意味着您的代码无法保证安全,因此只能 运行 在完全受信任的环境中。
但是,由于 Bitconverter 是 Microsoft 签署的标准 .Net 程序集的一部分,Windows 知道它们没问题。
库函数也不太容易出错,因为它们已经被每天使用它们的数百万开发人员久经考验,而您的函数仅由您测试过。
我自己编写了 class 将 C# 标准基元转换为字节数组。
后来看了BitConverter
classsource,看看高手是怎么做的
我的代码示例:
public static byte[] getBytes(short value) {
byte[] bytes = new byte[2];
bytes[0] = (byte)(value >> 8);
bytes[1] = (byte)value;
return bytes;
}
BitConverter class代码:
public unsafe static byte[] GetBytes(short value)
{
byte[] bytes = new byte[2];
fixed(byte* b = bytes)
*((short*)b) = value;
return bytes;
}
为什么他们的函数被标记为不安全并使用固定运算符?
这样的函数即使使用了unsafe也容易出错吗?我应该放弃我的并使用他们的实现吗?哪个效率更高?
是的,放弃你的并使用标准库。
效率更高,因为它通过将字节数组转换为短指针来同时复制两个字节。为此,它需要 fixed 以允许使用指针,因此需要 unsafe 关键字。
在您自己的程序集中通常要避免使用不安全的代码,因为这意味着您的代码无法保证安全,因此只能 运行 在完全受信任的环境中。
但是,由于 Bitconverter 是 Microsoft 签署的标准 .Net 程序集的一部分,Windows 知道它们没问题。
库函数也不太容易出错,因为它们已经被每天使用它们的数百万开发人员久经考验,而您的函数仅由您测试过。