С# переключатель типа переменной

Вопрос:

Есть ли лучший способ сделать это? Учитывая поток байтов, чтобы преобразовать его в нужный тип номера.

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

    public void GetValue(byte[] bytes, ref UInt16 value)
{
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
value = BitConverter.ToUInt16(bytes, 0);
}
public void GetValue(byte[] bytes, ref UInt32 value)
{
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
value = BitConverter.ToUInt32(bytes, 0);
}
public void GetValue(byte[] bytes, ref UInt64 value)
{
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
value = BitConverter.ToUInt64(bytes, 0);
}
etc...

Я предполагаю, что лучший способ, например, включить тип значения, а не реплицировать перегрузки.

Лучший ответ:

Ну, вы можете извлечь условность разворота массива, и я бы не использовал перегрузки вообще:

public ushort GetUInt16(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt16(bytes, 0);
}

public uint GetUInt32(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt32(bytes, 0);
}

public ulong GetUInt64(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt64(bytes, 0);
}

private static void ReverseIfLittleEndian(byte[] bytes)
{
    if (BitConverter.IsLittleEndian)
    {
        Array.Reverse(bytes);
    }
}

Если вы действительно хотите иметь один метод, я бы избегал попытки «милого» и придерживаться «простого и понятного». Да, вы получаете несколько аналогичных методов, но каждый из них прост для понимания, простого вызова и в основном нулевого обслуживания. Звучит неплохо…

Оцените статью
TechArks.Ru
Добавить комментарий