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

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