服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详细分析c# 运算符重载

详细分析c# 运算符重载

2022-09-28 15:37菜鸟教程 C#

这篇文章主要介绍了c# 运算符重载的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。

例如,请看下面的函数:

?
1
2
3
4
5
6
7
8
public static Box operator+ (Box b, Box c)
{
  Box box = new Box();
  box.length = b.length + c.length;
  box.breadth = b.breadth + c.breadth;
  box.height = b.height + c.height;
  return box;
}

上面的函数为用户自定义的类 Box 实现了加法运算符(+)。它把两个 Box 对象的属性相加,并返回相加后的 Box 对象。

运算符重载的实现

下面的程序演示了完整的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System;
 
namespace OperatorOvlApplication
{
  class Box
  {
   private double length;   // 长度
   private double breadth;   // 宽度
   private double height;   // 高度
 
   public double getVolume()
   {
     return length * breadth * height;
   }
   public void setLength( double len )
   {
     length = len;
   }
 
   public void setBreadth( double bre )
   {
     breadth = bre;
   }
 
   public void setHeight( double hei )
   {
     height = hei;
   }
   // 重载 + 运算符来把两个 Box 对象相加
   public static Box operator+ (Box b, Box c)
   {
     Box box = new Box();
     box.length = b.length + c.length;
     box.breadth = b.breadth + c.breadth;
     box.height = b.height + c.height;
     return box;
   }
 
  }
 
  class Tester
  {
   static void Main(string[] args)
   {
     Box Box1 = new Box();     // 声明 Box1,类型为 Box
     Box Box2 = new Box();     // 声明 Box2,类型为 Box
     Box Box3 = new Box();     // 声明 Box3,类型为 Box
     double volume = 0.0;     // 体积
 
     // Box1 详述
     Box1.setLength(6.0);
     Box1.setBreadth(7.0);
     Box1.setHeight(5.0);
 
     // Box2 详述
     Box2.setLength(12.0);
     Box2.setBreadth(13.0);
     Box2.setHeight(10.0);
 
     // Box1 的体积
     volume = Box1.getVolume();
     Console.WriteLine("Box1 的体积: {0}", volume);
 
     // Box2 的体积
     volume = Box2.getVolume();
     Console.WriteLine("Box2 的体积: {0}", volume);
 
     // 把两个对象相加
     Box3 = Box1 + Box2;
 
     // Box3 的体积
     volume = Box3.getVolume();
     Console.WriteLine("Box3 的体积: {0}", volume);
     Console.ReadKey();
   }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Box1 的体积: 210
Box2 的体积: 1560
Box3 的体积: 5400

可重载和不可重载运算符

下表描述了 C# 中运算符重载的能力:

 

运算符 描述
+, -, !, ~, ++, -- 这些一元运算符只有一个操作数,且可以被重载。
+, -, *, /, % 这些二元运算符带有两个操作数,且可以被重载。
==, !=, <, >, <=, >= 这些比较运算符可以被重载。
&&, || 这些条件逻辑运算符不能被直接重载。
+=, -=, *=, /=, %= 这些赋值运算符不能被重载。
=, ., ?:, ->, new, is, sizeof, typeof 这些运算符不能被重载。

 

实例

针对上述讨论,让我们扩展上面的实例,重载更多的运算符:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System;
 
namespace OperatorOvlApplication
{
  class Box
  {
    private double length;   // 长度
    private double breadth;   // 宽度
    private double height;   // 高度
   
    public double getVolume()
    {
     return length * breadth * height;
    }
   public void setLength( double len )
   {
     length = len;
   }
 
   public void setBreadth( double bre )
   {
     breadth = bre;
   }
 
   public void setHeight( double hei )
   {
     height = hei;
   }
   // 重载 + 运算符来把两个 Box 对象相加
   public static Box operator+ (Box b, Box c)
   {
     Box box = new Box();
     box.length = b.length + c.length;
     box.breadth = b.breadth + c.breadth;
     box.height = b.height + c.height;
     return box;
   }
   
   public static bool operator == (Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length == rhs.length && lhs.height == rhs.height
       && lhs.breadth == rhs.breadth)
     {
       status = true;
     }
     return status;
   }
   public static bool operator !=(Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length != rhs.length || lhs.height != rhs.height
       || lhs.breadth != rhs.breadth)
     {
       status = true;
     }
     return status;
   }
   public static bool operator <(Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length < rhs.length && lhs.height
       < rhs.height && lhs.breadth < rhs.breadth)
     {
       status = true;
     }
     return status;
   }
 
   public static bool operator >(Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length > rhs.length && lhs.height
       > rhs.height && lhs.breadth > rhs.breadth)
     {
       status = true;
     }
     return status;
   }
 
   public static bool operator <=(Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length <= rhs.length && lhs.height
       <= rhs.height && lhs.breadth <= rhs.breadth)
     {
       status = true;
     }
     return status;
   }
 
   public static bool operator >=(Box lhs, Box rhs)
   {
     bool status = false;
     if (lhs.length >= rhs.length && lhs.height
       >= rhs.height && lhs.breadth >= rhs.breadth)
     {
       status = true;
     }
     return status;
   }
   public override string ToString()
   {
     return String.Format("({0}, {1}, {2})", length, breadth, height);
   }
  
  }
  
  class Tester
  {
   static void Main(string[] args)
   {
    Box Box1 = new Box();     // 声明 Box1,类型为 Box
    Box Box2 = new Box();     // 声明 Box2,类型为 Box
    Box Box3 = new Box();     // 声明 Box3,类型为 Box
    Box Box4 = new Box();
    double volume = 0.0;  // 体积
 
    // Box1 详述
    Box1.setLength(6.0);
    Box1.setBreadth(7.0);
    Box1.setHeight(5.0);
 
    // Box2 详述
    Box2.setLength(12.0);
    Box2.setBreadth(13.0);
    Box2.setHeight(10.0);
 
    // 使用重载的 ToString() 显示两个盒子
    Console.WriteLine("Box1: {0}", Box1.ToString());
    Console.WriteLine("Box2: {0}", Box2.ToString());
    
    // Box1 的体积
    volume = Box1.getVolume();
    Console.WriteLine("Box1 的体积: {0}", volume);
 
    // Box2 的体积
    volume = Box2.getVolume();
    Console.WriteLine("Box2 的体积: {0}", volume);
 
    // 把两个对象相加
    Box3 = Box1 + Box2;
    Console.WriteLine("Box3: {0}", Box3.ToString());
    // Box3 的体积
    volume = Box3.getVolume();
    Console.WriteLine("Box3 的体积: {0}", volume);
 
    //comparing the boxes
    if (Box1 > Box2)
     Console.WriteLine("Box1 大于 Box2");
    else
     Console.WriteLine("Box1 不大于 Box2");
    if (Box1 < Box2)
     Console.WriteLine("Box1 小于 Box2");
    else
     Console.WriteLine("Box1 不小于 Box2");
    if (Box1 >= Box2)
     Console.WriteLine("Box1 大于等于 Box2");
    else
     Console.WriteLine("Box1 不大于等于 Box2");
    if (Box1 <= Box2)
     Console.WriteLine("Box1 小于等于 Box2");
    else
     Console.WriteLine("Box1 不小于等于 Box2");
    if (Box1 != Box2)
     Console.WriteLine("Box1 不等于 Box2");
    else
     Console.WriteLine("Box1 等于 Box2");
    Box4 = Box3;
    if (Box3 == Box4)
     Console.WriteLine("Box3 等于 Box4");
    else
     Console.WriteLine("Box3 不等于 Box4");
 
    Console.ReadKey();
   }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Box1: (6, 7, 5)
Box2: (12, 13, 10)
Box1 的体积: 210
Box2 的体积: 1560
Box3: (18, 20, 15)
Box3 的体积: 5400
Box1 不大于 Box2
Box1 小于 Box2
Box1 不大于等于 Box2
Box1 小于等于 Box2
Box1 不等于 Box2
Box3 等于 Box4

以上就是详细分析c# 运算符重载的详细内容,更多关于c# 运算符重载的资料请关注服务器之家其它相关文章!

原文链接:https://www.runoob.com/csharp/csharp-operator-overloading.html

延伸 · 阅读

精彩推荐
  • C#C# 添加、修改以及删除Excel迷你图表的实现方法

    C# 添加、修改以及删除Excel迷你图表的实现方法

    下面小编就为大家分享一篇C# 添加、修改以及删除Excel迷你图表的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    E-iceblue7462022-02-16
  • C#C# FTP操作类分享

    C# FTP操作类分享

    这篇文章主要为大家分享了C# FTP操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    孤者自清4462022-01-11
  • C#C# BackgroundWorker用法详解

    C# BackgroundWorker用法详解

    本篇文章主要介绍了C# BackgroundWorker使用详解 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    sparkdev11462021-12-31
  • C#ListView用法中与滚动相关的需求实现

    ListView用法中与滚动相关的需求实现

    这篇文章主要介绍了ListView用法中与滚动相关的需求实现,获取并设置ListView的滚动位置,以及获取滚动位置处的项目,具有一定的参考价值,感兴趣的小伙...

    WPInfo8042022-01-10
  • C#c# winform treelistview的使用(treegridview)实例详解

    c# winform treelistview的使用(treegridview)实例详解

    这篇文章主要介绍了c# winform treelistview的使用(treegridview),本文通过实例代码给大家详细介绍,需要的朋友可以参考下...

    波谷6192022-02-13
  • C#C#实现自定义Dictionary类实例

    C#实现自定义Dictionary类实例

    这篇文章主要介绍了C#实现自定义Dictionary类,较为详细的分析了Dictionary类的功能、定义及用法,具有一定参考借鉴价值,需要的朋友可以参考下...

    北风其凉11962021-10-18
  • C#C#利用原图和水印图的重叠简单实现水印的方法

    C#利用原图和水印图的重叠简单实现水印的方法

    这篇文章主要介绍了C#利用原图和水印图的重叠简单实现水印的方法,实例演示了完整的水印操作类实现方法,需要的朋友可以参考下...

    且行且思6182021-11-18
  • C#C#中如何为枚举类型添加描述方法【小技巧】

    C#中如何为枚举类型添加描述方法【小技巧】

    相信很多人对枚举并不陌生,枚举可以很方便和直观的管理一组特定值。下面这篇文章主要给大家介绍了关于C#中如何为枚举类型添加描述方法的相关资料...

    LamondLu7922022-03-09