欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#运算符重载

程序员文章站 2022-07-21 19:04:19
闲来无事,突发奇想,C#提供的基本类型可以进行运算符操作,那么自己创建的类型应该也可以进行运算符操作吧? 既然有了想法就要尝试着去实现,打开《CSharp Language Specification》,寻找方案。 扩展一下 在这里说明一下《CSharp Language Specification ......

闲来无事,突发奇想,c#提供的基本类型可以进行运算符操作,那么自己创建的类型应该也可以进行运算符操作吧?

既然有了想法就要尝试着去实现,打开《csharp language specification》,寻找方案。

扩展一下

在这里说明一下《csharp language specification》这个手册,真心不错。

c#语言规范(csharp language specification doc) 
一个微软官方的说明文档。 
当你安装完visual studio的以后,默认安装目录下就会有这个东西,一般在 c:\program files\microsoft visual studio 10.0\vc#\specifications\2052 下

知识点总结

  • 所有一元和二元运算符都具有可自动用于任何表达式的预定义实现。除了预定义实现外,还可通过在类或结构中包括 operator 声明来引入用户定义的实现。
  • 可重载的一元运算符 (overloadable unary operator) 有:

    +   -   !   ~   ++   --   true   false

  • 可重载的二元运算符 (overloadable binary operator) 有:

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

 小案例

有了相应的知识就练练手做一个案例吧,这里我做了一个 学生+学生 return 新的学生 的案例,xixi。

 1     class program
 2     {
 3         static void main(string[] args)
 4         {
 5             //实例化一个男孩
 6             student boy = new student() { sex = true };
 7             //实例化一个女孩
 8             student girl = new student() { sex = false };
 9             student student = boy + girl;
10             console.writeline($"哇! 是个{(student.sex?"男":"女")}孩");
11             console.readkey();
12         }
13 
14     }
15     class student {
16         public bool sex { get; set; }
17         public static student operator +(student stu1, student stu2)
18         {
19             //当sex不同的时候相加才能放回一个student
20             if (stu1.sex != stu2.sex)
21             {
22                 random random = new random();
23                 //返回一个随机性别的student
24                 return new student() { sex = (random.next(2) == 0) };
25             }
26             return null;
27         }
28         public static student operator !(student student)
29         {
30             //转变sex
31             return new student() { sex=!student.sex };
32         }
33     }