C#学习笔记——运算符重载、接口篇

C#学习笔记——(八)

  • 一、运算符重载
    • 1、可重载和不可重载运算符
    • 2、转换运算符
  • 二、接口
    • 1、is 和 as 运算符
    • 2、重载接口方法
    • 3、显示接口实现
  • 三、小结

一、运算符重载

  • 重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。 与其他函数一样,重载运算符有返回类型和参数列表。
  • 语法:
    public   ~  static   ~  返回值类型   ~  operator   ~  一元运算符   ~  (参数类型   ~   参数名)
    public   ~  static   ~  返回值类型   ~  operator   ~  二元运算符   ~  (参数1类型   ~   参数1名,参数2类型   ~   参数2名)

1、可重载和不可重载运算符

C#学习笔记——运算符重载、接口篇_第1张图片

using System;

namespace Day10
{
   
    public class Fraction
    {
   
        private int num1;
        private int num2;

        public Fraction (int num1,int num2)
        {
   
            this.num1 = num1;
            this.num2 = num2;
        }

        public static Fraction operator +(Fraction f1,Fraction f2)//重载+法
        {
   
            return new Fraction(f1.num1 + f2.num1, f1.num2 + f2.num2);
        }

        public static bool operator ==(Fraction f1,Fraction f2)
        {
   
            if (f1.num1 == f2.num1 && f1.num2 == f2.num2)
                return true;
            return false;
        }

        //委托给==
        public static bool operator !=(Fraction f1,Fraction f2)
        {
   
            return !(f1 == f2);
        }

        //判断是否为同一类型,再执行委托
        public override bool Equals(object obj)
        {
   
            if (!(obj is Fraction))  //检查对象运行时类型
                return false;
            return this == (Fraction)obj;//比较this == obj ,比较前先将obj强制转换为Fraction
        }

        public override string ToString()//复写Tostring
        {
   
            return String.Format("({0},{1})", num1, num2);
        }
    }

    public  class Tester
    {
   
        public void Run()
        {
   
            Fraction f1 = new Fraction(3, 4);
            Console.WriteLine("f1:{0}",f1.ToString());
            Fraction f2 = new Fraction(5, 6);
            Console.WriteLine("f2:{0}",f2.ToString());
            Fraction f3 = f1 + f2;
            Console.WriteLine("f3:{0}",f3.ToString());
            Fraction f4 = new Fraction(8, 10);
            if(f1==f2)
                Console.WriteLine("f1:{0}==f2:{1}",f1.ToString(),f2.ToString());
            else
                Console.WriteLine("f1:{0}!=f2:{1}", f1.ToString(), f2.ToString());
            if(f4.Equals(f3))
                Console.WriteLine("f4:{0}Equalsf3:{1}",f4.ToString(),f3.ToString());
        }
    }

    class Program
    {
   
        static void Main(string[] args)
        {
   
            Tester t = new Tester();
            t.Run();
        }
    }
}

注意:
1、如果重载了等于(==)运算符,那么也必须重载不等(!=)运算符,类似地有小于(<)和大于(>)必须成对,小于等于(<=)和大于等于(>=)必须成对。
2、如果重载了等于运算符,那么建议也要重载Equals()方法。
3、比较运算符必须返回bool类型的值,这是与其他算术运算符的根本区别。
4、运算符只能采用值参数,不能采用ref 或out 参数。

2、转换运算符

  • implicit 和 explicit通常叫作转换运算符,当转换能够成功并且不会发生信息丢失时,使用关键字implicit;如果存在丢失信息的风险,则需要使用关键字explicit。
  • 语法:
    public   ~  static   ~  implicit   ~  operator   ~  转换运算符的目标类型   ~  (参数输入类型   ~   参数名)
    public

你可能感兴趣的:(C#,unity,3d,c#)