Как работает функция 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 ответ
Да, бросьте свою и используйте стандартную библиотеку.
Это более эффективно, потому что он копирует оба байта одновременно, приводя байтовый массив к короткому указателю. Для этого требуется исправление, позволяющее использовать указатели и, следовательно, ключевое слово unsafe.
Небезопасный код, как правило, следует избегать в ваших собственных сборках, поскольку это означает, что ваш код не может быть гарантированно безопасен, и поэтому может выполняться только в полностью доверенных средах.
Однако, поскольку Bitconverter является частью стандартных сборок.Net, подписанных Microsoft, Windows знает, что они в порядке.
Библиотечные функции также менее подвержены ошибкам, потому что миллионы разработчиков используют их каждый день, а ваша функция была протестирована только вами.