2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 2019-02-13
  • 本文字数:1205 字

    阅读完需:约 4 分钟

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

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.com/news/2019/02/CSharp-Static-Delegate


2019-02-13 08:006512

评论 1 条评论

发布
用户头像
感觉第一个更好一些
过多的引入新机制将使得C#更加复杂
2019-02-13 17:04
回复
没有更多了
发现更多内容

如何用数字人技术让课堂活起来?番职院和3DCAT实时云渲染给出答案

3DCAT实时渲染

元宇宙 实时云渲染 虚拟数字人 AI虚拟形象

全方位赋能开发者成长!华为开发者联创日·深圳站圆满落幕

彭飞

从实际业务出发,OA上云我更推荐华为云

平平无奇爱好科技

作为IT从业者,为什么我推荐华为云ECS?

平平无奇爱好科技

作为ISV,这是我为什么选择华为云ECS的理由

平平无奇爱好科技

企业OA上云靠谱最重要,多年业务推进为何华为云成为我的首选?

平平无奇爱好科技

中国自动驾驶发展加速,已实现多场景落地应用

数据堂

2023-06-21:redis中什么是BigKey?该如何解决?

福大大架构师每日一题

redis 福大大架构师每日一题

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

福大大架构师每日一题

Java Go 福大大架构师每日一题

AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款商品了

Openlab_cosmoplat

人工智能 AI

云原生应用交付平台Orbit设计理念与价值主张

CODING DevOps

云原生 Orbit

全球唯一云厂商 华为云入选2023Gartner云数据库管理系统客户之选

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

企业上云数据安全不容忽视,华为云ERP上云解决方案全面保障信息安全

YG科技

聊一聊“会员制”

鲸品堂

会员中心 付费会员 企业号 6 月 PK 榜

沙利文发布《2023中国数据管理解决方案市场报告》,腾讯云位列领导者梯队

说山水

研发效能平台的“双流”模型

CODING DevOps

自动驾驶的必要技术和等级

数据堂

敏捷工具盘点

顿顿顿

敏捷工具 scrum工具 scrum敏捷工具

华院计算宣晓华:未来十年,基于数据与知识融合的模型将大放异彩

TE智库

人工智能 AI 华院计算

数字时代云成本越来越高,企业IT负责人们该如何选择弹性云服务器呢?

YG科技

中国的“贝尔实验室”:我们的数据库从内核的第一行代码写起

YashanDB

基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步

Databend

卡口服务 —— 基于前端巡检系统的拓展实践|得物技术

得物技术

高效协同办公+降本增效,华为云OA上云解决方案做了什么?

YG科技

生态共建丨YashanDB与天玑数据完成兼容互认证 - 知乎

YashanDB

Cloud Studio 浏览器插件来啦

CODING DevOps

学习 SSL/TLS ,这一篇就够了

火山引擎边缘云

TLS 证书 SSL证书

把金融航母开进智能峡湾,总共分几步?

脑极体

华为 AI 金融

C#未来新特性:静态委托和函数指针_语言 & 开发_Jonathan Allen_InfoQ精选文章