阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

未来的 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:001335
用户头像

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

关注

评论

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

权威媒体评选:2023年25个最佳开源软件

SEAL安全

开源 AI LLMs

夏志刚介绍

管理在线

企业战略管理体系 企业精益管理体系 企业创新管理类体系 企业培训体系 企业标准化管理体系

Wireshark网络工具是什么?

小齐写代码

Integrity plus for mac(网站链接检查工具)v12.8.6激活版

影影绰绰一往直前

Scrutiny for Mac(网站分析检测工具)v12.8.6激活版

影影绰绰一往直前

Mp3tag for Mac(音频标签编辑器)v1.8.13激活版

影影绰绰一往直前

2024-01-24:用go语言,已知一个n*n的01矩阵, 只能通过通过行交换、或者列交换的方式调整矩阵, 判断这个矩阵的对角线是否能全为1,如果能返回true,不能返回false。 我们升级一下:

福大大架构师每日一题

福大大架构师每日一题

华为云云绘本第2期:面对等保三级,谁还在瞎折腾?

华为云PaaS服务小智

软件开发 华为云

Integrity Pro for mac(网站死链接清理工具)v12.8.6激活版

影影绰绰一往直前

数仓如何递归查询视图依赖

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(DWS)

【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)

洛神灬殇

Linux 日志处理 Shell指令 查询日志 2024年第二十篇文章

Translatium for Mac(强大的mac翻译软件)v41.1.0中文版

影影绰绰一往直前

Dash for Mac(好用的API文档工具)v7.2.1激活版

影影绰绰一往直前

光纤的跳线和尾纤

小齐写代码

BricsCAD 24 mac中文完美破解版(CAD建模软件) 支持M和 macOS Sonoma 14 附安装教程

Rose

BricsCAD 23中文版 cad bricscad 24 BricsCAD 24破解版 BricsCAD 24下载

Dash for Mac(好用的API文档工具)v7.2.1激活版

影影绰绰一往直前

如何正确使用 Bean Validation 进行数据校验

得物技术

数据分析

什么是网络地址转换协议

郑州埃文科技

CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南

京东科技开发者

融合创新:传统企业数字化转型的业务、战略、操作和文化变革

天津汇柏科技有限公司

数字化转型

HTML代码加固:保障网站安全

雪奈椰子

基于Express的微信公众号开发

派大星

Express 微信公众号开发

Slidepad for mac:给你的 macOS 添加一块 iPad 式的悬浮窗口

Rose

Slidepad mac效率软件

有挑战才有收获!PaddleOCR算法模型挑战赛火热开启!

飞桨PaddlePaddle

人工智能 算法 大赛 百度飞桨 算法模型

Text Workflow for mac(文本格式转换工具)v1.8.3直装激活版

影影绰绰一往直前

Slidepad for Mac(高效率办公软件)v1.4.7激活版

影影绰绰一往直前

K8s集群CoreDNS监控告警最佳实践

华为云开发者联盟

开发 华为云 k8s集群 华为云开发者联盟

一篇全掌握!TDengine 在能源、电力、汽车、物流、工业制造等十大行业应用合集

TDengine

tdengine 时序数据库

用Python实现高效数据记录!Web自动化技术助你告别重复劳动!

测试人

软件测试

Mac上超好用的鼠标平滑滚动增强工具:SmoothScroll

Rose

Mac软件 鼠标工具 SmoothScroll 平滑滚动

PD虚拟机系统镜像 原版纯净的Windows系统安装包

Rose

windows 11 pd虚拟机 win系统下载

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