C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖

C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖

2018-05-19 15:20

C# 中的操作符重载并不新鲜。然而,到底有哪些操作符可以重载,重载操作符可以用来做哪些丧心病狂的事情呢?

本文收集了 C# 中所有可以重载的操作符,并且利用他们做了一些丧心病狂的语法糖。


可以重载的操作符

操作符的重载比想象中的更加强大。因为——重载操作符时可以随意定义操作符中操作数的数据类型和返回值的类型。

是的!不只是操作数,连返回值类型也能被重载

一元操作符

+, -, !, ~, ++, --, true, false

通过重载这些操作符,你可以改变某种类型操作后的返回类型和返回值。

不过,等等!+- 怎么会是一元操作符?不要忘了正数和负数哦!+5-6 这些其实是在使用一元操作符,而不是单纯的整数哦。

truefalse 也能被重载?是的,重载之后,你可以改变 if(foo) 这样的判断的行为。参见:C# 很少人知道的科技

二元操作符

+, -, *, /, %, &, |, ~, ^, <<, >>

其中 ~ 操作符的重载是微软操作符重载部分的官方文档中并没有提及的。不过 Avalonia 项目利用这个不怎么常用的运算符做出了丧心病狂的绑定语法糖。参见 Avalonia/Popup.cs at master · AvaloniaUI/Avalonia

_popupRoot = new PopupRoot(DependencyResolver)
{
    [~ContentControl.ContentProperty] = this[~ChildProperty],
    [~WidthProperty] = this[~WidthProperty],
    [~HeightProperty] = this[~HeightProperty],
    [~MinWidthProperty] = this[~MinWidthProperty],
    [~MaxWidthProperty] = this[~MaxWidthProperty],
    [~MinHeightProperty] = this[~MinHeightProperty],
    [~MaxHeightProperty] = this[~MaxHeightProperty],
};

必须成对重载的操作符

==, !=, <, >, <=, >=

其实成对重载并不是什么很大的限制,大不了都写了就行。不过,重载它们依然能写出强大的语法糖代码来。

虽不可被重载,却能被定义的操作符

索引器 [], 显示转换或隐式转换 (T) x

前面 Avalonia 的绑定语法糖就充分利用了索引器的特点,使得能够在对象初始化器中初始化那些本没有直接定义在类型中的属性。

虽不可被重载,却能够被间接重载的操作符

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

这些操作符不可被重载。不过,其实它们都算作是原本的二元操作符与赋值操作的组合。所以,可以通过重载二元操作符来达到间接重载这些操作符。(当然,这样的方式,其赋值的作用是绝对丢不掉的)。

不可被重载的操作符

=, ., ?:, ??, ->, =>, as, checked, unchecked, default, delegate, is, new, sizeof, typeof


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/overridable-operators-in-csharp.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

java提高篇之抽象类与接口

抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似,甚至可...

943
来自专栏编程

Python变量作用域

今天我们要说的是:变量的作用域 什么是作用域呢? 作用域就是某一个事件或者物体在某种情况下产生的特定的作用或效果(画外音:能不能说人话?) 好吧,那常老师来举个...

2106
来自专栏编程

Python数据类型之字符串第四季

各位小伙伴们 “黑一”快乐 本节课非常非常重要 请各位小伙伴 一定认真理解和学习 技术要点: 内建函数 函数的理解 如何使用一个函数 capitalize()函...

1840
来自专栏带你撸出一手好代码

正则表达式「^」符号的正确理解方式

「^」这个符号在正则表达式的中的应用相信是所有程序员都掌握的, 因为它是正则表达式中最基础最常用的知识点。 它在正则表达式中表示两种不同的意义 01 表示匹配一...

2813
来自专栏iKcamp

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 2 章:函数基础

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 2 章:函数基础 函数式编程...

3119
来自专栏Java编程

10个有关String的面试问题

下面是面试中最容易问到的有关String的问题。

1K2
来自专栏noteless

[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

说起来好像很啰嗦,但是如果有人告诉你 通过sin(x) 计算后, x的值被改变了,你不会觉得异常奇怪么

1122
来自专栏用户2442861的专栏

c++ 11 新特性

赖勇浩(http://laiyonghao.com) 声明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的《The Bigges...

871
来自专栏AI科技大本营的专栏

10分钟快速入门Python函数式编程

本文,你会了解到什么是函数式编程,以及如何用 Python 进行函数式编程。你还会了解到列表解析和其他形式的解析。

1282
来自专栏工科狗和生物喵

【计算机本科补全计划】《C++ Primer》:类型转换

正文之前 学习,不如爆文?反正晚上也不会学习,某个家伙也对我爱理不理的!!!!(这才是最骚的吧),刚好欠了 C++ Primer太多烂账了。不如赶紧还了! 对了...

3098

扫码关注云+社区

领取腾讯云代金券