当前位置: 首页 > news >正文

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

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


参考资料

  • Overloadable Operators (C# Programming Guide) - Microsoft Docs

相关文章:

  • 神器如 dnSpy,无需源码也能修改 .NET 程序
  • Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的
  • 如何根据一个绝对文件路径生成一个相对文件路径
  • 如何使用 MSBuild Target(Exec)中的控制台输出
  • C#/.NET 中推荐的 Dispose 模式的实现
  • Windows 10 四月更新,文件夹名称也能区分大小写?
  • WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
  • XML 的 XPath 语法
  • .NET 使用 XPath 来读写 XML 文件
  • 像黑客一样!Chrome 完全键盘操作指南(原生快捷键 + Vimium 插件)
  • 如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下
  • 在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中
  • WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • IDEA常用插件整理
  • java多线程
  • mysql innodb 索引使用指南
  • Spring Boot快速入门(一):Hello Spring Boot
  • 从0实现一个tiny react(三)生命周期
  • 机器学习中为什么要做归一化normalization
  • ------- 计算机网络基础
  • 马上搞懂 GeoJSON
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 时间复杂度与空间复杂度分析
  • 探索 JS 中的模块化
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 运行时添加log4j2的appender
  • 怎么将电脑中的声音录制成WAV格式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • $GOPATH/go.mod exists but should not goland
  • (0)Nginx 功能特性
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (三)elasticsearch 源码之启动流程分析
  • (十)T检验-第一部分
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (译)2019年前端性能优化清单 — 下篇
  • (转)winform之ListView
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Core 版本不支持的问题
  • .Net Core 中间件验签
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET面试题(二)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net网站发布-允许更新此预编译站点
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net中的设计模式——Factory Method模式
  • .NET中的十进制浮点类型,徐汇区网站设计
  • :O)修改linux硬件时间