Как работает функция 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 знает, что они в порядке.

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

Другие вопросы по тегам