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

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

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

关注

评论

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

【实战解析】淘宝店铺商品全量爬取:item_search_shop API深度指南

Noah

GIMP 3.0.0 (Linux, macOS, Windows) 正式版发布 - 免费开源图像编辑器

sysin

GIMP

Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret

FunTester

三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频

Yeauty

rust ffmpeg Video media audio

昇腾AI携手22家伙伴发布大模型应用一体机,让企业AI落地更简单

极客天地

测试技艺 | 在AI极速发展下重塑

技艺的尾巴

人工智能 AI 软件测试 推动软件业变革 测试技艺

企业分公司异地组网难题怎么解决?

Ogcloud

企业组网 异地组网

原生APP的性能优化

北京木奇移动技术有限公司

软件外包公司 原生APP开发 APP开发公司

时序数据库 IoTDB 常见问题 Q&A 第六期

Apache IoTDB

原生APP和混合APP开发的对比

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包公司

一款体验故障定位的神器

乒乓狂魔

故障定位 AIOPS 可观测

征程 6X CAMSYS 性能测试方案介绍

地平线开发者

自动驾驶 算法工具链 地平线征程6

混沌工程没有银弹

FunTester

原生APP开发的优势和特点

北京木奇移动技术有限公司

原生APP 软件外包公司 APP外包公司

【Redis深度专题】「踩坑技术提升」一文教会你如何在支持Redis在低版本Jedis情况下兼容Redis的ACL机制

码界西柚

redis 权限控制 acl 底层原理 访问控制列表

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS HPE (慧与) 定制版

sysin

esxi

Netty源码—Reactor线程模型二

不在线第一只蜗牛

Java 数据库 Linux

PureBasic 6.20 (macOS, Linux, Windows) - 现代的 BASIC 编程语言及 IDE

sysin

PureBasic

混合APP上线时需要的问题

北京木奇移动技术有限公司

软件外包公司 APP开发公司

《Operating System Concepts》阅读笔记:p460-p4470

codists

操作系统

VMware vSphere Replication 9.0.2.2 发布 - 虚拟机复制和数据保护

sysin

vSphere

SvelteKit 最新中文文档教程(8)—— 部署 Node 服务端

冴羽

vue.js 前端 React Svelte SvelteKit

工作中最常用的 8 种设计模式

不在线第一只蜗牛

设计模式

TCL电子(01070.HK)2024年经调整归母净利润同比翻倍

财见

鸿蒙NEXT开发案例:程序员计算器

zhongcx

StarRocks 与主流 BI 工具兼容性盘点(Superset/帆软/QuickBI/Tableau)

镜舟科技

MySQL OLAP BI 分析型数据库 StarRocks

昇腾支持150+企业上线DeepSeek模型及服务,昇腾人工智能伙伴峰会顺利召开

极客天地

51Talk发布2024年Q4财报:第四季度营业收入同比增长117.3%

财见

一键部署 GPU Kind 集群,体验 vLLM 极速推理

Se7en

从青铜到王者系列(1):手把手教你用WSL 2在Windows 11家庭版上安装Docker,开发必备教程!

程序员老王

vivo 湖仓架构的性能提升之旅

StarRocks

SQL优化 presto 兼容性测试 StarRocks 物化视图

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