阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

未来的 C#之覆写放宽

  • 2017-05-02
  • 本文字数:1259 字

    阅读完需:约 4 分钟

能使用协变(covariant)返回类型,这是一个在.NET 中常被请求到的特性。例如,可以使用“override Widget Clone()”覆写“virtual object Clone()”。从类型安全的角度看,这种做法完全可以接受,但是当前并不被 C#所允许。

根据“对协变返回类型的建议”,该规则将被放宽,使得相比于基类中的方法,子类中的同一方法可以返回更具体的类型。除了上例中给出的 Clone 方法之外,这种放宽对抽象工厂和其他框架代码也会十分有用。

隐式投影(Implicit Shadowing) 在 C#中,一种可能的实现方法是发射(Emit)两个函数。还以 Clone 方法为例,我们可以在中间语言(IL)中看到如下的方法签名(Method Signature):

复制代码
override object Clonable.Clone()
public new Widget Clone()

按 HaloFour 的说法,这是可以工作的,原因在于:

在通用语言运行库(CLR,Common Language Runtime)规范中,看上去的确允许覆写具有不同的名字,并可以具有不同的可见性(Visibility)。

[…]

通过在 IL 中显式地使用“.override”语句,我能解决所有的重载决议(Overload Resolution)问题,并能使用具有不同可见性和名字的方法进行覆写。

该编译器特性可与现有的 CLR 版本无缝工作,并且旧版本的 VB 或 C#将可以毫无问题地消费这样的类。

但是这一做法也存在着一些限制。首先,从覆写方法正常继承而来的属性是不能被拷贝到隐藏(New)方法中的。从技术上讲,编译器可以拷贝基类属性到隐藏方法上。但是这种做法存在着问题,一旦添加隐藏属性添加到基类方法,就将需要对子类进行重编译。

其次,这也会导致在使用反射(Reflection)时,难以看到隐藏方法与被覆写的基类方法之间的关联。

最后一点,这会对通过基类接口的调用方法产生性能上的影响。但是,该问题可以通过尾调用(Tail Call)及其他优化技术缓解。

属性

在 C#中,另一种可能的实现方法是使用新属性。如果编译器能识别该属性,则会针对更具体的类型自动添加强制转换(Cast)。

该方法的一个缺点在于,如果新属性不能被语言所理解,就不能使用该方法。当然,新属性也必须添加到基础类库(BLC,Base Class Library)中,这意味着它不会在所有的平台上立刻可用。

另一个缺点是,它可能会在处理结构体时引入不必要的装箱(Boxing)操作。继续以上面的 Clone 方法为例,编译器将必须装箱一个 WidgerStruct 结构体,然后立刻将其强制转换为一个正常的 WidgetStruct 结构体。

投影和覆写的放宽

另一种替代做法是放宽对投影的限制规则。当前,一个方法是不允许同时被投影和覆写的。但是,考虑到 CLR 是支持这种做法的,C#只是允许显式地编写如下代码:

复制代码
class Widget : Cloneable
{
public override Cloneable Clone()
{
return this.Clone();
}
public new Widget Clone()
{
return [...];
}
}

根据隐式投影的建议,这将依赖编译器去重命名重载方法。

时间表

需要指出的是,大部分该特性相关的讨论出现于 2015 年上半年,即两年之前。但是该建议是在今年二月份才正式写完,因此尚未采取任何行动,或者说尚未公开采取任何行动。

查看英文原文: C# Futures: Relaxed Overrides

2017-05-02 19:001333
用户头像

发布了 227 篇内容, 共 71.3 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

低代码平台在自动驾驶系统开发中的应用

不在线第一只蜗牛

自动驾驶 低代码 交通

Allins 官网上线,标志铭文赛道正式进入 AMM 交易时代

EOSdreamer111

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

石头财经

Java注解,看完就会用

快乐非自愿限量之名

Java Python 元数据

2023 IoTDB Summit:清华大学软件学院长聘副教授龙明盛《IoTDB 新组件:内生机器学习》

Apache IoTDB

测试开发 | 人工智能与大数据的融合:创新、应用与未来趋势

测吧(北京)科技有限公司

测试

监督学习算法详解:模型训练、分类与预测

测吧(北京)科技有限公司

测试

低代码技术:颠覆数据孤岛的技术利器

快乐非自愿限量之名

数据 低代码 数据孤岛

真的好简单,开发搭建了自己的体育赛事直播平台

软件开发-梦幻运营部

SEO长尾效应:掌握这个策略,助力你的独立站SEO长效增长

九凌网络

测试开发 | 从原理到实战,四天带你轻松进阶Python

测吧(北京)科技有限公司

测试

测试开发 | 神经网络架构与设计:探索人工智能的大脑

测吧(北京)科技有限公司

测试

如何评估 RAG 应用的质量?最典型的方法论和评估工具都在这里了

Zilliz

评估 AIGC LLM rag

Allins 官网上线,标志铭文赛道正式进入 AMM 交易时代

BlockChain先知

USBclean for Mac(USB专杀工具) v3.8激活版

影影绰绰一往直前

CentOS下nginx的安装

Jackey

nginx

详尽解读:甲骨文云 OCI Cloud 入门与管理全攻略

Geek_2d6073

软件测试/测试开发丨Web端测试—CSS讲解 学习笔记

测试人

软件测试

苹果市值一夜蒸发 1071 亿美元;「团结引擎创世版」发布丨 RTE 开发者日报 Vol.118

声网

探讨数字化转型的必要性与重要性

高端章鱼哥

转型 低代码 数字化

2023到2024年:前端发展趋势展望

EquatorCoco

前端 前端开发 低代码 低代码开发

测试开发 | 无监督学习与聚类算法:数据中的潜在结构解析

测吧(北京)科技有限公司

测试

TuGraph Analytics交互式图查询:让图所见即所得

TuGraphAnalytics

图分析 图查询 图可视化

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

股市老人

语音AI小夜灯项目

二哈侠

使用腾讯云大数据Elasticsearch 8.8.1实现:NLP+Vector Search+GAI

腾讯云大数据

ES

测试开发 | Python-列表

测吧(北京)科技有限公司

测试

什么是DePIN,2024年需要了解的DePIN项目

TechubNews

区块链 DePIN

Scrum敏捷工具管理大全汇总

顿顿顿

敏捷工具 scrum工具 scrum管理工具 敏捷研发管理工具 scrum工具敏捷

测试开发 | 数据挖掘在人工智能中的作用:洞察、预测与创新

测吧(北京)科技有限公司

测试

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

长安区块链

未来的C#之覆写放宽_.NET_Jonathan Allen_InfoQ精选文章