博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CLR via C#学习笔记-第八章-操作符重载方法
阅读量:5110 次
发布时间:2019-06-13

本文共 1367 字,大约阅读时间需要 4 分钟。

8.4 操作符重载方法

有的语言允许类型定义操作符应该如何操作类型到实例。例如,许多类型比如System.String都重载了相等==和不等!=操作符。

CLR对操作符重载一无所知,他甚至不知道什么是操作符。是编程语言定义了每个操作符的含义,以及这些特殊符号出现时应该生成什么样的代码。

例如在C#中,向基元类型到数字应用+符号,编译器生成将两个数加到一起到代码。将+符号应用于String对象,编译器生成将两个字符串连接到一起的代码。

测试不等性时,C#使用!=符号,而VB使用<>。最后,^在C#中的含义是异或XOR,在VB中为求幂。

虽然CLR对操作符一无所知,但她确实规定了语言应该如何公开操作符重载,以便由另一种语言的代码使用。每种编程语言自己决定是否支持操作符重载。

 

C#对操作符重载的要求

编译源代码时,编译器会生成一个标识操作符行为的方法。CLR规范要求操作符重载方法必须是public和static方法。

另外C#要求操作符重载方法至少有一个参数的类型与当前定义这个方法的类型相同。之所以这样限制,是为了时C#编译器能在合理时间内找到要绑定的操作符方法。

 

定义一个操作符重载方法

以下C#代码展示了在一个类中定义的操作符重载方法:

public sealed class Complex{    public static Comple operator+(Complex c1,Complex c2){}  }

编译器为名为op_Addition的方法生成元数据方法定义项。这个方法定义项还设置了specialname标志,表明这是一个特殊方法。

编译器看到源代码中出现一个+操作符会检查是否有一个操作数到类型定义了名为op_Addition的specialname方法,而且该方法的参数兼容于操作数的类型。

如果存在这样的方法,编译器就生成调用它的代码。不存在就报告编译错误。 

 

C#到一元操作符及其相容于CLS(公共语言规范)的方法名

C#操作符 特殊方法名  推荐的相容于CLS的方法名
+ op_UnaryPlus Plus
- op_UnaryNegation Negate
op_LogicalNot Not
~ op_OneComplement OnesComplement
++ op_Increment Increment
-- op_Decrement Decrement
op_True IsTrue{get;}
op_False IsFalse{get;}

 

 

 

 

 

 

 

 

 

更多参见CLR via C#第187页表8-2

 

CLR规范规定了许多额外的可重载的操作符,但C#不支持这些额外的操作符。

检查Framework类库FCL的核心数值类型,会发现他们没有定义任何操作符重载方法。之所以不定义是因为编译器会在代码中专门查找针对这些基元类型执行的操作,并声称直接操作这些类型的实例的IL指令。

如果类型要提供方法,而且编译器要生存代码来调用这些方法,方法调用就会产生额外的运行时开销。

另外方法最终都要执行一些IL指令来完成你希望的操作。这正是核心FLC类型没有定义任何操作符重载方法的原因。

转载于:https://www.cnblogs.com/errornull/p/9775359.html

你可能感兴趣的文章
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>