如何在C#中实现C样式函数指针,不使用委托

如何在C#中实现C样式函数指针,不使用委托,第1张

概述我正在学习C#中的指针,并且好奇如果可以在C#中使用C样式函数指针.是的,我知道C#有自己的等效功能指针概念(称为委托).但我只是想知道使用C#中的指针是否可以实现相同,而不使用委托. 如果在C#中使用指针是完全合法的(使用不安全选项)并且指针语义几乎与C/C++类似,那么在我看来也应该能够使用C/C++样式函数指针.请指导我这个.可能吗?如果是的话怎么样?如果不是那么为什么? 请注意C#和C/C 我正在学习C#中的指针,并且好奇如果可以在C#中使用C样式函数指针.是的,我知道C#有自己的等效功能指针概念(称为委托).但我只是想知道使用C#中的指针是否可以实现相同,而不使用委托.

如果在C#中使用指针是完全合法的(使用不安全选项)并且指针语义几乎与C/C++类似,那么在我看来也应该能够使用C/C++样式函数指针.请指导我这个.可能吗?如果是的话怎么样?如果不是那么为什么?

请注意C#和C/C++中指针使用的相似性,如下例所示

/* Using pointers in C# (Very similar to C/C++) */using System;namespace UnsafeCodeApplication{   class TestPointer   {      public unsafe static voID Main()      {         int[]  List = {10,100,200};         fixed(int *ptr = List)         /* let us have array address in pointer */         for ( int i = 0; i < 3; i++)         {            Console.Writeline("Address of List[{0}]={1}",i,(int)(ptr + i));            Console.Writeline("Value of List[{0}]={1}",*(ptr + i));         }         Console.ReadKey();      }   }}
解决方法 其他答案注意到C#没有任何内置支持,即使在不安全模式下,函数指针也是正确的.

有趣的是要考虑实现此功能需要什么.碰巧的是,我已经在一个未发布的C#原型版本中实现了这个功能.那时候.也许2011年.

我们决定对原型进行审查,结果是语法不够愉快,使用案例不足以证明推进该功能的合理性.

首先,该功能对代表有什么好处?委托是类型安全的,并且很好地捕获对绑定到其接收器的函数的引用的语义.但是,在某些“系统”场景中 – 首先使用原始指针指向内存的相同场景 – 委托只是过于重量级.它们被垃圾收集,它们增加了收集压力,与指针大小相比它们是一个大对象,它们在每次调用时都有成本,等等.或者,您可能正在构建自己的自定义布局vtable,以便与一些特别讨厌的非托管代码进行互 *** 作,并且您希望调用一个刚刚放在vtable中的函数指针.等等.

CLR具有必要的指令:calli,指向间接的调用.但是C#中没有任何语法结构会导致C#编译器发出这条指令.

所以有什么问题?只需添加一些导致它被发出的语法,对吧?

问题是:什么语法?为了确保CLR的物理堆栈保持正确对齐,编译器必须知道通过指针调用的方法的签名.当然,我们已经有了一种机制来说明方法的签名是什么:称为委托,我们已经拒绝使用这样的东西.此外,请记住,我们在这里谈论的是实际将被 *** 纵的物理堆栈,而不是CLR的抽象评估堆栈.调用的函数的签名必须包括例如函数指针是cdecl还是syscall.

我们挣扎了一段时间才想出一些看起来并不可怕的东西,无论我们尝试哪种方式,它看起来都更加可怕.我实际上不记得我们最终为原型实现的符号;我想我可能已经阻止了它.我可能会在我的笔记中找到它,但不幸的是我现在没有时间看.

这个功能一次又一次地提出来. C#团队目前的管理层在低级应用程序中使用托管语言已经有了历史,所以如果你有一个强大的用例,现在可能是再次推销它的好时机.

总结

以上是内存溢出为你收集整理的如何在C#中实现C样式函数指针,不使用委托全部内容,希望文章能够帮你解决如何在C#中实现C样式函数指针,不使用委托所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存