【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

关注

评论

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

实用推荐系统:寻找有用的用户行为

博文视点Broadview

2020-Android-面试重难点(万字篇),android屏幕适配的五种方式

android 程序员 移动开发

2020你与字节跳动只差这份笔记,我靠着这份笔记,工资从15K到了40K(1)

android 程序员 移动开发

云上远程运维的最后那点担心,“云梯”帮你解决

华为云开发者联盟

运维 华为云Stack 远程运维 安全可信 云梯

用一套代码实现APP和小程序

Speedoooo

容器 移动开发 ios开发 APP开发 Andriod开发

飞鹤乳业数智化转型之路

大咖说

云计算 数字化转型 数字化 企业上云

TDSQL | 深度解读HTAP系统的问题与主义之争

腾讯云数据库

tdsql 国产数据库

2020 国内互联网公司的Android工程师薪酬排名!看看你是什么水平

android 程序员 移动开发

2020Android-目前最稳定和高效的UI适配方案!你头秃都没想到还能这样吧!

android 程序员 移动开发

浅析openLooKeng安全认证机制

openLooKeng

大数据 ldap openLooKeng 安全认证

JPA + EclipseLink + 云平台 = 运行在云端的数据库应用

Jerry Wang

数据库 Cloud Cloud Native 11月日更

使用JPA + Eclipselink操作PostgreSQL数据库

Jerry Wang

eclipse 数据库 11月日更

超简单教程!自动部署openLooKeng

openLooKeng

大数据 计算引擎 openLooKeng 安装部署

教你如何在Spark Scala/Java应用中调用Python脚本

华为云开发者联盟

Java Python spark JVM Spark Scala

2020你与字节跳动只差这份笔记,我靠着这份笔记,工资从15K到了40K

android 程序员 移动开发

2020 更新 - 腾讯 Android 面试 (已拿到月薪22K offer)

android 程序员 移动开发

双11在即,分享一些稳定性保障技术干货

老张

系统稳定性 大促 生产环境全链路压测

【Java原理剖析系列】深度synchronized工作原理分析

洛神灬殇

java 11月日更

硬核干货!TDSQL全局一致性读技术详解|

腾讯云数据库

tdsql 国产数据库

新版本发布!openLooKeng v1.4.0上线

openLooKeng

大数据 计算引擎 openLooKeng

2020一个Android大牛的面试经历分享(金九银十面试30多家公司)

android 程序员 移动开发

2020上半年百度Android岗(初级到高级)面试真题全收录

android 程序员 移动开发

TDSQL已助力20余家金融机构完成核心替换

腾讯云数据库

tdsql 国产数据库

助力邯钢工业4.0!TDengine在深度(平潭)节水减排项目中的应用

TDengine

数据库 tdengine 后端

2020Android面经,历时一个半月,斩获3个大厂offer,移动端开发工程师面试题

android 程序员 移动开发

2020Android 开发年度总结:“这一年里我到底做了些啥,面试阿里的时候一定会问到的

android 程序员 移动开发

模块三作业

doublechun

「架构实战营」

2020Android开发者学习路线(快速篇),分析android进程管理机制

android 程序员 移动开发

TDSQL将发布免费版本,助力国产数据库生态完善

腾讯云数据库

数据库 tdsql

恒源云(GPUSHARE)_U1S1,1年1度GPU云种草大会

恒源云

深度学习

2020 年需要关注的 5 大 Android 开发技术(1),Android知识总结

android 程序员 移动开发

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