У меня следующая проблема. Я хочу преобразовать целочисленное значение или значение с плавающей запятой в массив байтов. Обычно я использую метод BitConverter.GetBytes().
int i = 10;
float a = 34.5F;
byte[] arr;
arr = BitConverter.GetBytes(i);
arr = BitConverter.GetBytes(a);
Есть ли возможность сделать это с помощью неявных/явных методов??
arr = i;
arr = a;
и наоборот??
i = arr;
a = arr;
Ответ 1 · рейтинг 4 · Dan Byström
Вы можете сделать это через промежуточный класс. Компилятор не будет выполнять два неявных приведения сам по себе, поэтому вы должны сделать одно явное приведение, а затем компилятор вычислит второе.
Проблема заключается в том, что при неявном приведении необходимо либо привести к, либо из типа, в котором вы объявили приведение, и вы не можете наследовать от запечатанных классов, таких как 'int'.
Так что это совсем не элегантно. Методы расширения, вероятно, более элегантны.
Если вы объявите класс ниже, вы можете делать такие вещи, как:
byte[] y = (Qwerty)3;
int x = (Qwerty) y;
public class Qwerty
{
private int _x;
public static implicit operator byte[](Qwerty rhs)
{
return BitConverter.GetBytes(rhs._x);
}
public static implicit operator int(Qwerty rhs)
{
return rhs._x;
}
public static implicit operator Qwerty(byte[] rhs)
{
return new Qwerty {_x = BitConverter.ToInt32(rhs, 0)};
}
public static implicit operator Qwerty(int rhs)
{
return new Qwerty {_x = rhs};
}
}
Ответ 2 · рейтинг 3 · NDJ
вы можете создать методы расширения, чтобы немного очистить вызывающий код, так что вы получите:
int i = 10;
float a = 34.5F;
byte[] arr;
arr = i.ToByteArray();
arr = a.ToByteArray();
Код для методов расширения будет выглядеть примерно так:
public static class ExtensionMethods
{
public static byte[] ToByteArray(this int i)
{
return BitConverter.GetBytes(i);
}
public static byte[] ToByteArray(this float a)
{
return BitConverter.GetBytes(a);
}
}