- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在检查 C# 和 .NET 中的委托(delegate)时,我注意到了一些有趣的事实:
在 C# 中创建委托(delegate)会创建一个派生自 MulticastDelegate
的类,并带有构造函数:
.method public hidebysig specialname rtspecialname instance
void .ctor(object 'object', native int 'method') runtime managed { }
意味着它需要实例和指向方法的指针。然而,在 C# 中构造委托(delegate)的语法表明它具有构造函数
new MyDelegate(int () target)
我可以将 int ()
识别为函数实例(int *target()
将是 C++ 中的函数指针)。所以很明显 C# 编译器从函数名定义的方法组中挑选出正确的方法并构造委托(delegate)。所以第一个问题是,C# 编译器(或准确地说是 Visual Studio)从哪里选择这个构造函数签名?我没有注意到任何特殊属性或可以区分的东西。这是某种编译器/visualstudio 魔法吗?如果不是,T (args) target
构造在 C# 中是否有效?我没有设法用它编译任何东西,例如:
int () target = MyMethod;
无效,因此对 MyMetod
做任何事情也是如此,例如在其上调用 .ToString()
(嗯,这确实有一定道理,因为从技术上讲,这是一个方法 group,但我想应该可以明确地挑选出一个方法通过强制转换,例如 (int())MyFunction
。那么所有这些纯粹的编译器魔术是什么?通过反射器查看构造揭示了另一种语法:
Func CS$1$0000 = new Func(null, (IntPtr) Foo);
这与反汇编的构造函数签名一致,但无法编译!
最后一个有趣的注意事项是 Delegate
和 MulticastDelegate
类还有另一组构造函数:
.method family hidebysig specialname rtspecialname instance void .ctor(class System.Type target, string 'method') cil managed
从实例和方法指针到类型和字符串方法名称的转换发生在哪里?这可以用自定义委托(delegate)构造函数签名中的 runtime managed
关键字来解释吗,即运行时是否在这里完成它的工作?
编辑:好的,所以我想我应该重新表述我想通过这个问题表达的意思。基本上,我建议在委托(delegate)构造中不仅涉及 C# 编译器/CLR 魔法,而且还有一些 Visual Studio 魔法,因为 Intellisense 在建议构造函数参数时会翻转一些新语法,甚至隐藏其中一个它们(例如,Reflector 不使用这种语法和构造函数)。
我想知道这个断言是否正确,以及函数实例语法在 C# 中是否有更深层次的含义,或者它只是 Visual Studio 魔术部分为了清晰起见而实现的一些常量格式(这是有道理的,因为它看起来无效C#) ?简而言之,如果我正在实现 Intellisense,我应该为委托(delegate)做一些魔术,还是可以通过一些聪明的机制来构建建议?
最终编辑:所以,普遍的共识是这确实是 VS 魔法。看到此类 VS 行为的其他示例(请参阅 Marc Gravell 的评论)使我相信情况确实如此。
最佳答案
第一个参数是从对象引用中解析出来的(对于静态方法,则为null
);那里没有魔法。
关于第二个 参数,但是 - 它是一个非托管指针( native int);简而言之,没有其他直接 C# 语法可以使用此构造函数 - 它使用特定的 IL 指令 (ldftn
) 从元数据解析函数。但是,您可以使用 Delegate.CreateDelegate
通过反射创建委托(delegate)。您也可以使用 IL emit(DynamicMethod
等),但这并不好玩。
关于c# - .NET 中的委托(delegate) : how are they constructed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443757/
按照此页面上的教程:https://cdkworkshop.com/20-typescript/40-hit-counter/300-resources.html 我相信this ,传递给 Table
据我所知std::allocator::construct在旧版本的 C++ 上仅需要两个参数;第一个是指向原始的、未构造的内存的指针,我们要在其中构造 T 类型的对象。第二个是用于初始化该对象的元素
我正在阅读 CanJS API 文档并遇到 can.Construct.extend http://canjs.com/docs/can.Construct.extend.html .我知道 can.
考虑 struct C { C() { printf("C::C()\n" ); } C(int) { printf("C::C(i
阅读 git repo 中截取的以下代码时遇到一些问题。链接到存储库和问题: https://github.com/paolo-sz/fatty/blob/master/src/winmain.c#L
除了将一种高级语言转换为另一种高级语言的编译器之外,任何编译为机器代码的编译器都需要用汇编编写吗? 最佳答案 编译器的源代码不需要用汇编语言编写。例如,CPython 编译器(好吧,技术上解释器)的(
我正在努力计算 worklist算法,我不想实现迭代算法,因为它需要很多冗余步骤。 我用来计算实时变量工作列表的算法如下 任何人都可以为下面给出的示例向我解释一下,初始工作列表是什么以及工作列表算法将
我有这部分语法 S ‐> S a | S b a | a | S b c S | S b c b | c S | c b 我需要使用它来创建一些 SD 集,然后在解析表上使用它。 但是,在此之前,我应
是否有人引用了有关着色器编译器/图形驱动程序编译器内部工作原理的文档和研究? 最佳答案 编写一个普通的 C 编译器和编写一个着色器编译器没有太大的区别。编写编译器的标准书是所谓的“龙书”: http:
请问有没有人能给我解释一下句法导向的切线线性码和伴随码的区别。 它与使用编译器推导代码有关。 我知道它们是在程序中推导数学方程式的不同方法,但是,我不知道如何解释它们。 提前致谢。 问候。 最佳答案
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
在编译器数据流分析中,变量的有效范围与其达到定义之间有什么区别?两者似乎都指的是同一件事... 最佳答案 它们是完全不同的东西,我建议您回过头来重新阅读那些使您感到困惑的定义。除其他事项外,对于使用给
我目前正在为一种非常有限的面向对象语言开发编译器。我想将所有值视为对象,这些值上的运算符将作为方法实现。编译器将程序转换为基于堆栈的虚拟机的汇编程序。 在编译期间,我将整数文字转换为特殊“整数”类的对
给定抽象语法树,我被要求编写一个程序来构建输入程序代码的数据流图。我在网上搜索数据流图的定义,发现一个代码段的数据流分析有很多事情要做。我想知道为给定代码构建数据流图到底需要绘制什么。很感谢任何形式的
一些随机的想法捕获了我,我就是无法摆脱它。我在想,既然现代处理器只是不同种类汇编语言的解释器,那么有没有办法创建一些直接在硬件中实现的高级语言解释器,使用一些 HDL 甚至直接使用逻辑门设计? 同时我
出现在代码生成的寄存器分配阶段的寄存器溢出或溢出代码是什么意思,编译器后端必须将变量分配到内存或寄存器? 最佳答案 Hardware registers是昂贵的(在芯片面积和寻址它们所需的指令位数方面
如果您的 bootstrap 语言编译器运行良好且可维护,为什么要更改它?例如,Go 在 1.5 版本中将其编译器重新编写为自托管,导致 compile times to become much sl
我在 Python Lisp 编译器和一些 C 链接器的源代码中看到了这个术语。 我的猜测是,修复只是 assembly 例程的一些包装,可确保对齐正确,但我对这里的任何事情都不确定。 最佳答案 “修
我对 VM 在运行时和编译时的优化感兴趣。我认为优化在编译时是最有效和最简单的。 然而,我的想法在某些情况下似乎是错误的。这在 Steve Yeggie's statement quoted by D
如果您正在构建一个编译器,那么在 AST 级别进行哪种优化是最好的? 最佳答案 大多数情况下,您无法在 AST 级别进行有趣的优化,因为您需要有关数据如何从程序的一个部分流向另一部分的信息。虽然数据流
我是一名优秀的程序员,十分优秀!