Как глобальная функция может существовать в C #? - PullRequest
19 голосов
/ 04 сентября 2011

Как глобальная функция может существовать в C #, когда все определено внутри класса?Я читал документацию OpCodes.Call на MSDN и был удивлен, увидев следующие формулировки:

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

Глобальная функция?Существует ли это в C #?(Это определенно не относится к методу static, поскольку он явно указан вместе с глобальной функцией).

Ответы [ 7 ]

15 голосов
/ 04 сентября 2011

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

Однако C # не единственный язык, который использует CLR. Можно написать Managed C ++, который может иметь глобальные функции.

13 голосов
/ 03 апреля 2014

На конференции Build 2014 было объявлено, что начиная с Roslyn, вы можете импортировать статические методы из типов с помощью директивы using TypeName;, так что вместо использования System.Math.Min(...) вы можете сделать:

using System.Math;
...
var z = Min(x,y);

Примечание: ко времени выпуска это стало:

using static System.Math;
7 голосов
/ 04 сентября 2011

Потому что System.Reflection.Emit.OpCodes.Call не о C #. Речь идет об испускании кодов IL. В IL есть функции, которые недоступны в C #. Глобальные функции - одна из таких функций.

3 голосов
/ 04 сентября 2011

Я просто перезаписываю свой предыдущий ответ ...

Вот как выглядит каждый из них в IL DASM со связанными кодами:

// Static Method
IL_0001:  call       void testapp.Form1::Test()

// Instance Method
IL_0001:  call       instance void testapp.Form1::Test()

// Virtual Method
IL_0001:  callvirt   instance void testapp.Form1::Test()

// Global Function
IL_0000:  call       void testapp.Test()

Итак, чтобы ответить на ваш вопрос, в последнем методе для C # нет прямого способа сгенерировать токен метаданных. Мне пришлось создать последний в C ++.

3 голосов
/ 04 сентября 2011

C # не поддерживает все функции MSIL.Глобальные функции - одна из них.VB.Net, F #, IronPython или другой язык, позволяющий использовать эту и другие функции, которые не генерируются компилятором C #.

3 голосов
/ 04 сентября 2011

Документация, на которую вы ссылаетесь, относится к .net. C # не обслуживает глобальные функции, но .net делает.

3 голосов
/ 04 сентября 2011

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

...