C# 每发布一次新版本,都会增加一些底层相关的新特性, 这些特性对大多数商业程序来说并没什么实际用处,主要用于那些对性能有很高要求的代码,如图形处理、机器学习以及数学工具包,等等。

接下来的两个提案,主要实现了新的引用类型和函数调用方式。

静态委托

C# 中的普通委托是一种比较复杂的数据结构。它包含一个函数指针、一个针对 this 参数的对象引用(可选),以及一个指向委托链的链接。同其他引用类型变量相同,这个结构体也采用了堆分配方式,具有同样的内存压力。此外,在非托管代码中使用它时,需要进行组装。

与普通委托相比,静态委托就简单得多。它同样是一个结构体,但这个结构体只包含了一个 IntPtr 类型的函数指针。因此,静态委托是一种结构类型的变量,就是说不论在托管还是非托管代码中,它都具有相同的内存分布,在调用本机代码时也不需要进行组装了。

静态委托声明的语法如下:

static delegate int Func()

我们可以使用类似于UnmanagedFunctionPointer的属性来指定其他设置,如字符集和调用约定。

静态委托也有一些使用限制,例如只能引用静态函数,不能引用对象的成员方法,因为没有可用于存储对象指针的内存空间。此外,静态委托不能链接到其他的委托。

在 CLR(公共语言运行时) 层,静态委托通过中间层指令 calli(call indirect)来调用,而普通委托则通过中间层指令 call 或 callvirt(call virtual)来调用。

为了实现代码的向后兼容性,本提案允许从静态委托隐式转换到普通委托。但普通委托到静态委托则只能依靠显式转换,因为并不是所有的普通委托都满足静态委托的要求。

你可以在 GitHub 上有关静态委托提案的信息。

函数指针

函数指针则是另外一个比较有吸引力的新提案(我们姑且称它为函数指针,因为它实现了一个类似 C++ 的指针标示符 *)。这个提案同样使用了中间层指令 calli(call indirect)和 ldftn(load method pointer)。与静态委托一样,它也需要先有一个声明,只不过使用关键字 funcptr 替换了 delegate:

funcptr int F1(int value);

当调用本机函数时,调用者首先要确定一个调用约定。而这将会影响栈中变量的排列次序,以及使用结束后该由调用者还是被调用者来负责清理栈。这个提案可使用的调用约定有 cdecl、fastcall、stdcall、thiscall 和 winapi。开发者可以通过修改委托声明来指定所需要的调用约定:

funcptr cdecl int F1(int value);

在这个提案里,函数指针只能在非安全上下文中使用。

作为提案的一部分,你可以在函数名前面使用地址操作符(&)来生成一个函数指针。这个操作同样也只能在非安全上下文中使用。

函数指针的其他限制与静态委托相同。例如,它们只能引用静态函数,不能链接到其他委托等。

这两项提案目前都在讨论之中,还没有真正纳入 C# 的路线图。还有一个叫作 Compiler Intrinsics 的提案,但是因为有一些额外的限制,它被采用的可能性不是很高。

原文地址:https://www.infoq.cn/article/3xbaNiB_ChbH8McgiEz5

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

C# 未来新特性:静态委托和函数指针相关推荐

  1. C#未来新特性:静态委托和函数指针

    C#每发布一次新版本,都会增加一些底层相关的新特性, 这些特性对大多数商业程序来说并没什么实际用处,主要用于那些对性能有很高要求的代码,如图形处理.机器学习以及数学工具包,等等. 接下来的两个提案,主 ...

  2. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...

  3. 【C++11新特性】 C++11智能指针之weak_ptr

    http://blog.csdn.net/xiejingfa/article/details/50772571 原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/ar ...

  4. (转载)委托与函数指针辨析

    转载自 http://www.cnblogs.com/weidagang2046/archive/2009/08/09/1542248.html 感谢作者分享! 我们常见到C#技术文献用"类 ...

  5. c++11新特性_【C++11新特性】 C++11智能指针之weak_ptr

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以 ...

  6. Java8新特性JDK8之joining函数

    Java8新特性玩转JDK8之joining函数 Collectors.joining 方法介绍 该方法用来对流中元素字符串拼接,后以一个字符串进行显示. 该方法有三种重载 Collectors.jo ...

  7. PHP7新特性和废弃的函数

    一篇写给准备升级PHP7的小伙伴的文章 https://blog.csdn.net/u011957758/article/details/73320083 PHP7新特性 https://lvtao. ...

  8. C# 8 新特性 - 静态本地方法

    从C# 8 开始,本地方法就可以是静态的了. 与其他的本地方法不同,静态的本地方法无法捕获任何本地状态量. 直接看例子: 这段代码里有两个本地方法,他们分别对实例的一个字段和方法里的一个本地变量进行了 ...

  9. C++ 11 新特性(十二)函数新特性、内联函数、const详解

    函数后置返回类型 //后置返回类型 auto fun(int, int)->int; 内联函数 在函数定义前增加关键字 inline ,使得该函数变成内联函数 (1) 适用于函数体很小,调用很频 ...

最新文章

  1. 基于引擎的matlab+vc混合编程的配置
  2. android国际化(多语言)
  3. 性别有什么用_为啥不让男孩玩布娃娃?别让你的“性别偏见”,给孩子的人生设限...
  4. linux环境部署ltmj,Linux系统安装与简单配置 图文.docx
  5. Java运行机制和运行过程基础知识
  6. Android 系统(223)---Android-打包与快速打包
  7. python3生成文件对象(五分钟读懂)
  8. paip.C#.net 悬浮窗口的建立总结
  9. 逻辑为基、数企赋能(NO.7)—非逻辑思维
  10. 串口仪器控制(下篇)——利用虚拟串口模拟仪器
  11. WIN SERVER 2008安装VS2015踩坑小结
  12. java九宫格案例讲解_Java实现九宫格的教程详解
  13. 级联选择器实现省市区三级联动
  14. C++之观察者(Event-Subscriber)模式
  15. JS遍历(循环)——JS对象遍历(循环)JS数组遍历(循环)
  16. Impala入门操作
  17. 游戏设计模式阅读笔记19——优化模式(空间分区)
  18. 肖特基和快恢复二极管区别
  19. MII接口(Media Independent Interface)
  20. Mac更新后ae不能打开,ae安装后打开报错解决方法

热门文章

  1. BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
  2. Java8新特性--CompletableFuture
  3. 在MVC项目中使用Ninject
  4. Linux 内核中断内幕【转】
  5. C#学习笔记——通用对话框
  6. linux笔记 3-4 SMTP,.配置电子邮件传输
  7. mysql数据库的备份和二进制日志恢复
  8. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。
  9. 观察者模式VS发布-订阅模式
  10. .NET Core Runtime vs .NET Framework Runtime