2015-08-15 7 views
14

Я написал свой собственный класс, который преобразует стандартные примитивы C# в байтовые массивы.Как работает функция GetBytes?

Позже я взглянул на класс BitConvertersource, чтобы узнать, как это сделали профессионалы.

Мой код Например:

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; 
} 

Почему их функции помеченной как небезопасные и использовать фиксированный оператор?

Являются ли такие функции склонными к ошибкам, даже если они небезопасны? Должен ли я просто отказаться от своей работы и использовать ее реализацию? Что более эффективно?

+3

Эти функции выполняют разные вещи: первый использует большой endian, последний нативный endian. – CodesInChaos

ответ

12

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

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

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

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

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

+0

Имеет смысл, я думаю, я должен создавать только оболочки вокруг класса BitConverter, такие как GetBytes из строки. – Scavs

+3

@Scavs Для 'String' вы должны использовать' System.Text.Encoding.GetBytes' (https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110) .aspx), а не битконвертер. – Rotem

+0

Вы правы, я думаю, я должен отрезать «изобретать колесо». – Scavs

Смежные вопросы