Как работает функция GetBytes?
Я написал свой собственный класс, который преобразует стандартные примитивы C# в байтовые массивы.
позже, я взглянул на BitConverter
класс источник, чтобы посмотреть, как профессионалы это сделали.
мой пример кода:
public static byte[] getBytes(short value) {
byte[] bytes = new byte[2];
bytes[0] = (byte)(value >> 8);
bytes[1] = (byte)value;
return bytes;
}
код класса BitConverter:
public unsafe static byte[] GetBytes(short value)
{
byte[] bytes = new byte[2];
fixed(byte* b = bytes)
*((short*)b) = value;
return bytes;
}
почему их функции помечены как небезопасные и используют фиксированный оператор?
такие функции подвержены ошибкам, даже если они используют небезопасные? Должен ли я просто бросить свои и использовать их? реализации? Что более эффективно?
1 ответов
да, отбросьте свой и используйте стандартную библиотеку.
Это более эффективно, потому что он копирует оба байта сразу, бросая массив байтов в короткий указатель. Для этого требуется fixed, чтобы разрешить использование указателей и, следовательно, небезопасного ключевого слова.
небезопасный код обычно следует избегать в ваших собственных сборках, поскольку это означает, что ваш код не может быть гарантирован безопасным и поэтому может выполняться только в полностью доверенных средах.
однако, так как Bitconverter часть стандартных сборок .Net, подписанных Microsoft, Windows знает, что они в порядке.
библиотечные функции также менее подвержены ошибкам, потому что они были закалены миллионами разработчиков, использующих их каждый день, в то время как ваша функция была протестирована только вами.