|
|
1
6
首先,在C#中没有这样的“函数”。C#中的每个可执行实体实际上都是一个方法,也就是说,它属于
C编译器创建一个
班在幕后,并把lambda机构
所以假设你有这个代码:
C#编译器将从中创建一个IL代码。IL代码不能立即执行,它需要在虚拟机中运行。
IL代码将包含一个类
的IL代码
注意这些
NET运行时包含JIT(实时)编译器。它将IL代码转换为实际可执行的代码 .
当.NET运行时第一次遇到IL代码“call”方法时
这一切都将发生在
一旦发生这种情况,运行时就可以执行该方法了。CPU获取编译代码的第一个操作地址作为下一个要执行的操作,并继续执行,直到代码返回。然后,运行时再次接管并继续执行下一个IL指令。
这个
总之,方法不表示为
不能在C#中的类之外定义全局“函数”。你呢 能够 获取指向已编译(jitted)方法代码的直接本机指针,甚至可能通过直接操作自己进程的内存来手动调用它。但为什么呢? |
|
|
2
3
显然,你误解了脚本语言、C/C++和C语言之间的主要区别。 我想主要的困难在于 在C语言中没有函数这样的东西# . 完全。 C#7引入了新特性“本地函数”,但这不是JS中的函数。 方法 这个名字故意不同于 功能 程序 强调C#中所有可执行代码都属于一个类的事实。 编译器将在具有匿名方法声明的方法所属的同一(或嵌套)类中生成一个实方法。 所以呢 所有方法(匿名或非匿名)都属于一个类。 除了说 . 根据你所说的引用,它可以是
方法信息 MethodInfo.Invoke 非常相似的方法 Function..apply JS中的函数。您已经在委托源代码中看到了如何使用该类。 希望它能澄清一些事情。 |
|
|
3
1
委托只是指向具有指定参数和返回类型的方法的指针(要跳转到的内存位置)。任何与签名(参数和返回类型)匹配的方法都有资格完成角色,而与定义的对象无关。Anonymous只是表示委托未命名。 C#是一种强类型语言。这意味着每个表达式(包括委托)都必须具有返回类型(包括void)和强类型参数(如果有的话)。泛型的创建是为了允许显式类型在一般上下文(如列表)中使用。 换句话说,委托是C++安全回调的类型安全管理版本。 委托允许代码跳转到正确的处理程序而不测试任何条件,从而有助于消除switch语句。 委托类似于Javascript术语中的闭包。
如果您希望传递函数,我建议您尝试F#。 编辑 如果您试图模仿javascit的行为,我将尝试通过接口使用继承。我可以模拟多重继承,同时也是类型安全的。但是,请注意,它不能完全取代Javascript的依赖注入模型。 |
|
|
4
0
正如您可能发现的,C#没有JavaScript示例中的函数概念。
(不执行此操作,请使用Func/Action)
|
|
|
5
0
来自维基百科:
因此,当C#编译并找到一个委托时,它只需要生成一个函数,然后在变量中存储一个对该函数的反射引用,这样就可以传递它,并用它做各种很酷的事情。实际上,并不是将函数本身存储在变量中,而是存储一个引用,它有点像一个地址,指向函数存储在RAM中的位置。 |