神刀安全网

C#中如何利用操作符重载

C#中如何利用操作符重载

多态性是OOP(面向对象编程)的基本原则之一。多态性(Polymorphism)来源于两个词——“poly”意为很多,“morph”意为形式。因此,多态性意味着同样的事情以不同的形式存在。

操作符重载是静态多态性的一个示例。可以利用操作符重载或增加操作符功能,使用基本数据类型相同的用户定义类型方法进行操作。

什么是操作符?什么是能被重载的操作符?

表达式中通常有操作符和操作数。操作符对操作数起作用并且是表达式中的一部分。举例说明,下面是一个表达式,包含两个操作数和一个操作符。操作数是X和Y,操作符是+。

X+Y

操作符被分为一元、二元、比较、赋值等,取决于它们的目的和操作符运算操作数。虽然大多数的操作符可被重载,但仍有一些限制。本质上来说,并不是所有的操作符都能被重载。

一元运算符,只有一个操作数的运算符被重载。也可以重载二元操作符或者比较操作符,如“==”、”!=”、”<”、”>”、“<=”和“>=”。不能重载“=”、“?”、“->”、“new”、“is”、”sizeof”和”typeof”操作符。也不能重载条件操作符如&&和||。另外,数组索引操作符“[]”也不能被重载。

查看更多的可被重载的操作符

C#中实现操作符重载

本节中将探讨如何在C#中实现操作符重载。考虑下面DistanceCalculator类。

public class DistanceCalculator    {          Int32 feet = 0, inch = 0;         public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)         {              this.feet = feet;            this.inch = inch;         }      }

阅读上述代码。DistanceCalculator类包含两个Int32数据成员,即feet和inch。现在我们将在类中添加更多的方法来说明操作符如何被重载。

使用操作符重载时,需要记住几点。第一点,操作符重载应该有相对应的方法,如使用关键字符标记。第二点,运算符函数的参数是操作数和运算符函数的返回值。最后,运算符函数应该是静态的且是包含类型的一个成员。

下面的代码片段说明了一个典型的运算符函数功能。该示例展示了“==”和“!=”操作符能够被重载。

 public static bool operator ==(DistanceCalculator obj1,  DistanceCalculator obj2)          {             return obj1.Value == obj2.Value;          }         public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)          {             return obj1.Value != obj2.Value;         }

注意:值是一个属性且返回值是inch。

 public Int32 Value          {             get             {                 return (feet * 12) + inch;             }       } 

以下是完整的DistanceCalculator类代码。

public class DistanceCalculator     {         Int32 feet = 0, inch = 0;         public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)         {             this.feet = feet;              this.inch = inch;         }         public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)         {             return obj1.Value == obj2.Value;         }         public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)         {             return obj1.Value != obj2.Value;         }         public override bool Equals(object obj)         {             DistanceCalculator distanceCalculator = obj as DistanceCalculator;             if (distanceCalculator != null)             {                  return (distanceCalculator == this);             }             return false;         }         public override int GetHashCode()         {             return Value.GetHashCode();         }       public Int32 Feet         {             get { return feet; }         }         public Int32 Inch         {             get { return inch; }         }          public Int32 Value         {             get             {                 return (feet * 12) + inch;             }         }     }

下面代码片段说明如何使用DistanceCalculator类。

static void Main(string[] args)         {             DistanceCalculator obj1 = new DistanceCalculator(1, 2);             DistanceCalculator obj2 = new DistanceCalculator(1, 2);             Console.WriteLine((obj1 == obj2).ToString());             Console.Read();          }

下面代码片段说明如何重载“+”操作符来添加两个对象。

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)         {             Int32 totalInches = obj1.Value + obj2.Value;             Int32 feet = totalInches / 12;             Int32 inch = totalInches % 12;             DistanceCalculator temp = new DistanceCalculator(feet, inch);             return temp;         }

在DistanceCalculator类中添加两个属性。下面代码片段显示如何添加两个DistanceCalculator类型的对象并返回结果,即返回对象是DistanceCalculator类型。

public Int32 Feet         {              get { return feet; }         }         public Int32 Inch         {             get { return inch; }         }

以下是如何创建两个DistanceCalculator类的实例,利用重载操作符函数分配结果到另一个相同类型对象中。

static void Main(string[] args)         {             DistanceCalculator obj1 = new DistanceCalculator(1, 11);             DistanceCalculator obj2 = new DistanceCalculator(1, 2);             DistanceCalculator obj3 = obj1 + obj2;             Console.WriteLine("Feet: "+obj3.Feet.ToString());             Console.WriteLine("Inch: " + obj3.Inch.ToString());             Console.Read();         } 

英文来源: How to work with operator overloading in C#
作者:Joydip Kanjilal
译者:屠敏,欢迎技术投稿、约稿,给文章纠错,请发送邮件tumin@csdn.net。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » C#中如何利用操作符重载

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址