2011-09-03 43 views
19

当在一个类中定义了一切时,C#中如何存在全局函数?我在MSDN读取的OpCodes.Call的文档,并惊讶地发现以下字眼,C#中如何存在全局函数?

元数据令牌携带足够的信息,以确定该呼叫是否是一个静态方法,实例方法,虚拟方法, 或全局函数。

全局函数?它存在于C#中吗? (它绝对不涉及static方法,因为它与全局函数一起明确列出)。

+3

OpCodes.Call不是针对C#,但对CLR –

+0

如果我们告诉你,我们不得不KIL你。 ;)认真的说,全局变量是不好的 - 不要去实现它们。 – TrueWill

+0

为什么全局函数/方法的定义不好? –

回答

15

您不能在C#中使用全局函数,它只是不属于该语言的一部分。你必须在你选择的某个类上使用静态方法来获得类似的功能。

但是C#并不是唯一使用CLR的语言。可以编写托管C++,它可以具有全局功能。

+1

但是我听说过,当你编写Managed C++(或C++/CLI)时,所有的全局函数都被压入由编译器生成的静态类中。实际上,没有全球功能的概念。 – Nawaz

+0

这可能发生在封面下,我不确定。如果您找到该链接,请将其发布。还有其他语言......我没有做完整的调查。 –

+7

@Nawaz:这是一个与本次讨论没有密切关系的实现细节。要点在于'System.Reflection.Emit'属于IL,而不属于C#或托管C++或任何其他编译为IL且位于.NET Framework之上的语言。 Managed C++中是否存在全局函数或它们如何实现并不重要。重要的是,在解释IL的虚拟或真实机器中,存在全局函数的概念,并且可以使用System.Reflection.Emit.OpCodes.Call来发出可以调用全局函数的IL操作码。 – jason

3

我想是的事情是,这是IL注入操作,但IL是而不是绝对只有关于C#。换句话说,它支持支持全球功能的语言。

+0

例如?... – Nawaz

+1

@Nawaz:我相信这是关于像动态语言一样的,例如IronPython,F#(不太确定)。一个有趣的东西可以在这里找到方法动态生成:http://msdn.microsoft.com/en-us/library/system.reflection.emit.modulebuilder.createglobalfunctions(VS.95).aspx – Tigran

3

您提到的文档是.net。 C#不支持全局函数,但.net可以。

+1

究竟如何?请在你的回答中更慷慨。 :-)(我刚接触.Net)。 – Nawaz

+2

.net是一个平台。 C#编译器存在于该平台之上,但.net被设计为服务于C#以上。 C#设计人员选择不在该语言的设计中考虑全局功能,但在.net上构建的其他语言可以选择这样做。事实上,.net充满了不通过个别语言暴露的功能。 –

7

因为System.Reflection.Emit.OpCodes.Call不是关于C#的。这关乎发射IL操作码。在IL中,有些功能在C#中不可用。全球功能就是这些功能之一。

3

C#不支持MSIL的所有功能。全球职能就是其中之一。 VB.Net,F#,IronPython或其他一些语言来使用这些和其他功能,这些功能并不是由C#编译器生成的。

+0

他们可能,他们可能不会。没关系。关键是IL支持它们,因此解释IL的虚拟或真实机器支持它们。编译为IL的其他语言是否执行,或者如果这些语言的编译器将这些全局函数转换为编译后的IL中的全局函数,则无关紧要。 – jason

3

我只是覆盖我以前的答案...

下面是每个看起来像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++中创建最后一个。

11

在构建2014会议上曾宣布,从罗斯林起,您可以通过using TypeName;指令汇入类型的静态方法,使的,而不必使用System.Math.Min(...)你可以这样做:

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

注:由发行时本变成了:

using static System.Math; 
+0

+1。伟大的信息! – Nawaz

+0

尽管在原始问题的意义上,这仍然不是一个全球性的功能;它是句法速记,省去了输入“System.Math.Min”或“Math.Min”的麻烦。就运行时而言,它仍然只是类“System.Math”上的静态函数 – jimmyfever