Как работает функция GetBytes?

Я написал свой собственный класс, который преобразует стандартные примитивы С# в массивы байтов.

Позже я взглянул на 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

Да, отбросьте и используйте стандартную библиотеку.

Это более эффективно, потому что он копирует оба байта сразу, отбрасывая массив байтов на короткий указатель. Для этого требуется фиксированное разрешение, позволяющее использовать указатели и, следовательно, небезопасное ключевое слово.

Небезопасный код, как правило, следует избегать в ваших собственных сборках, так как это означает, что ваш код не может быть гарантирован безопасным, и поэтому его можно запускать только в полностью доверенных средах.

Однако, поскольку Bitconverter является частью стандартных сборников .Net, подписанных Microsoft, Windows знает, что они в порядке.

Функции библиотеки также подвержены ошибкам, потому что они сражались миллионами разработчиков, использующих их каждый день, тогда как ваша функция была проверена только вами.