Почему я не могу закодировать const структуры? - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу закодировать жестко закодированное значение структуры const Point.

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

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

РЕДАКТИРОВАТЬ:

Для пояснения: Время компиляции означает C # -> IL-байт-код, который хранится в выходной сборке.

Пример варианта использования:

public void Draw(Bitmap bmp, Point Location = new Point(0,0)) // invalid

Это ошибка, поскольку new Point(0,0) не может быть вычислено во время компиляции.Я могу передать int X = 0, int Y = 0 или обнуляемый Point? Location = null и сгенерировать структуру внутри метода, или перегрузить метод без дополнительных параметров и вызвать основной метод, передавая значения по умолчанию, но этот метод влечет за собой снижение производительности в терминахиз дополнительных вызовов методов требуется.

Это может не подходить для всех структур, поскольку конструктор может полагаться или изменять внешнее состояние или случайность.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

Предположим, ваша структура:

public struct TestStruct
{
 public int x;
 public string y;
}

public byte[] GetTestByte(TestStruct c)
{
    var intGuy = BitConverter.GetBytes(c.x);
    var stringGuy = Encoding.UTF8.GetBytes(c.y);
    var both = stringGuy.Concat(intGuy).Concat(new byte[1]).ToArray();
    return both;
}

Теперь вы можете кодировать байтовый массив, например:

Convert.ToBase64String(byteArray);

Нет прямого способа кодировать структуру.В лучшем случае это тип значения и, вероятно, он унаследован от C и C ++

.
0 голосов
/ 20 декабря 2018

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

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

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

Процесс проектирования на C # открыт, и доступен исходный код компилятора. Почему вы не разработали и не внедрили эту функцию? Если для вас было бы справедливо задать этот вопрос дизайнерам, то для них было бы справедливо задать его вам!Вы программист;Займитесь программированием компьютеров и создайте эту функцию, если считаете, что она того стоит, а затем убедите языковую команду принять ваш запрос на выборку.Если вы не думаете, что это стоит вашего времени, то, вероятно, дизайнеры языка чувствуют то же самое.

Мой вопрос: есть ли способ жестко закодировать предопределенный наборбайтов в c #, которые могут быть интерпретированы во время компиляции как соответствующий тип, так как все структуры имеют предопределенный контур памяти.

Я не уверен, что вы подразумеваете под "во время компиляции";Вы можете уточнить?

Есть способы хранения байтовых массивов в сборке, конечно.Создайте программу на C # с байтовым массивом, инициализированным для всех постоянных значений, и ildasm сборки;вы увидите код, сгенерированный компилятором C # для получения изображения байтового массива из метаданных и в массив.

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

В качестве альтернативы, C ++ / CLI, вероятно, реализует нужную вам функцию;Я никогда не использовал его, но это похоже на то, что он будет делать.Вы можете написать небольшую программу на C ++ / CLI, которая будет делать то, что вы хотите, и затем либо (1) использовать сборку этой программы как зависимость вашей сборки, (2) скомпилировать ее как сетевой модуль, связать ее с вашей сборкой через обычныйМеханизм связывания сетевого модуля (гадость) или (3) определяют, как они реализовали эту функцию, а затем делают то же самое.

...