Действительно ли метапрограммирование возможно в C#?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

37
задан Brian R. Bondy 8 December 2009 в 21:26
поделиться

7 ответов

Нет, метапрограммирование этой сложности не поддерживается непосредственно языком C#. Однако как сказанный @littlegeek, текстовый Шаблонный Инструментарий Преобразования включенный с Visual Studio позволит Вам достигать генерации кода любой сложности.

31
ответ дан Community 27 November 2019 в 04:24
поделиться

Нет, метапрограммирование не возможно в C#.

5
ответ дан ryanyuyu 27 November 2019 в 04:24
поделиться

Необходимо быть осторожными при разговоре о времени компиляции при контакте с Java или.Net языками. На тех языках можно выполнить более мощный metaprogamming (в более широком смысле - отражении-), чем C++ вследствие того, что "время компиляции" (JIT) может быть отложено после "времени выполнения";)

6
ответ дан thAAAnos 27 November 2019 в 04:24
поделиться

Существенное различие между Дженериками.NET и Шаблонами C++ - то, что дженерики специализированы во времени выполнения. Шаблоны расширены во время компиляции. Динамическое поведение дженериков делает вещи как Linq, деревья выражений, Тип. MakeGenericType (), независимость языка и возможное повторное использование кода.

, Но существует цена, Вы не можете, например, использовать операторы на значениях общего аргумента типа. Вы не можете записать станд.:: сложный класс в C#. И никакое метапрограммирование времени компиляции.

4
ответ дан Hans Passant 27 November 2019 в 04:24
поделиться

Это будет возможным. Наблюдайте за Anders Hejlsberg будущее разговора о C# .

3
ответ дан Özgür 27 November 2019 в 04:24
поделиться

К очень ограниченная степень, C# что-то, что могло быть интерпретировано как метапрограммирование. Но действительно это - не что иное как разрешение перегрузки. Это - реальный фрагмент для вызова его метапрограммированием.

Пример:

static string SomeFunc<T>(T value) {
    return "Generic";
}
static string SomeFunc(int value) {
    return "Non-Generic";
}

static void Example() {
    SomeFunc(42);           // Non-Generic
    SomeFunc((object)42);   // Generic
}
3
ответ дан JaredPar 27 November 2019 в 04:24
поделиться

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

Один из способов обойти это - выполнить метапрограммирование из вне языка, используя инструменты преобразования программ . Такие инструменты могут анализировать исходный код и выполнять в нем произвольные преобразования (в любом случае это то, что делает метапрограммирование), а затем выплевывать исправленную программу.

Если у вас есть система преобразования программ общего назначения, которая может анализировать произвольные языки, вы можете затем выполнять метапрограммирование на любом языке или на любом языке, который вам нравится. См. Наш DMS Software Reengineering Toolkit для такого инструмента, который имеет надежные интерфейсы для C, C ++, Java, C #, COBOL, PHP и ряда других языков программирования, и был используется для метапрограммирования всего этого.

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

РЕДАКТИРОВАТЬ (в ответ на комментарий): можно применить DMS для реализации задачи OP на C #.

7
ответ дан 27 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: