C# 中那些可以被重载的运算符,以及使用它们的那些丧心病狂的语法糖
C# 中的操作符重载并不新鲜。然而,到底有哪些操作符可以重载,重载操作符可以用来做哪些丧心病狂的事情呢?
本文收集了 C# 中所有可以重载的操作符,并且利用他们做了一些丧心病狂的语法糖。
可以重载的操作符
操作符的重载比想象中的更加强大。因为——重载操作符时可以随意定义操作符中操作数的数据类型和返回值的类型。
是的!不只是操作数,连返回值类型也能被重载!
一元操作符
+
, -
, !
, ~
, ++
, --
, true
, false
通过重载这些操作符,你可以改变某种类型操作后的返回类型和返回值。
不过,等等!+
和 -
怎么会是一元操作符?不要忘了正数和负数哦!+5
,-6
这些其实是在使用一元操作符,而不是单纯的整数哦。
true
和 false
也能被重载?是的,重载之后,你可以改变 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
参考资料
C# 中那些可以被重载的运算符,以及使用它们的那些丧心病狂的语法糖的更多相关文章
- 详解es6 class语法糖中constructor方法和super的作用
大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...
- C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...
- C++运算符重载——重载特殊运算符
1.重载赋值运算符= 赋值运算符用于同类对象间的相互赋值.赋值运算符只能被重载为类的非静态成员函数,不能重载为友元函数和普通函数. 对于用户自定义的类而言,如果没有重载赋值运算符,那么C++编译器会为 ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++中operator关键字(重载操作符)
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...
- C#中如何利用操作符重载和转换操作符 (转载)
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 《挑战30天C++入门极限》C++运算符重载转换运算符
C++运算符重载转换运算符 为什么需要转换运算符? 大家知道对于内置类型的数据我们可以通过强制转换符的使用来转换数据,例如(int)2.1f;自定义类也是类型,那么自定义类的对象在很多情况下也 ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- 在 lua 中实现函数的重载
在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...
随机推荐
- 分享几道Java线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录
问题描述 今天在一个新的Linux环境添加用户的时候,发现不能添加,遇到了以下错误 useradd: cannot open /etc/passwd 解决方法 用lsattr命令查看/etc/pass ...
- 新浪云连接数据库php
一般数据库连接$con = mysql_connect("localhost", "root", ""); 而新浪云共享数据库 <?p ...
- python学习大纲目录(转自alex博客https://www.cnblogs.com/alex3714/)
day01: 介绍.基本语法.流程控制 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 ...
- Java获取未知类型对象的属性
获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...
- 虚拟机VMware搭建代码环境
安装git yum install git -y 安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/ins ...
- python 调用接口
这个比较乱,抽口再修改一下. 工作需要调有赞API的接口数据, 返回数据. 进行数据处理 现在两部分比较重要:1 自动获取数据 , 2处理excel的过程. 明白接口的过程.传入参数 htt ...
- 006PHP基础知识——数据类型(三)
<?php /** * 数据类型(三) * PHP是一个弱类型的语言 */ //检测数据类型:gettype() 返回字符串的数据类型 /*$str="美丽中国"; echo ...
- java中容器的学习与理解
以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器.瞬间就蒙了.于是各种搜资料学习了一下,下面是我学习后整理出来的的一些 ...
- ftp的虚拟用户的搭建
虚拟的搭建在安装的根匿名的一样,在改配置文件之前需要创建虚拟的账号 路径为/etc/vsftpd/ 创建pam认证文件 然后修改配置文件其余的文件配置跟本地的一样. 然后重启vsftpd服务 想要实现 ...