Csharp-运算符重载

Csharp-运算符重载

运算符重载是将运算符看作方法,在类中重新定义其方法功能

注:Java中不存在此功能,如果想实现此功能则直接编写方法


双目运算符

public static 返回值类型 operator 运算符号(参数类型 参数1, 参数类型 参数2)

namespace Demo05
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var left = new Box();
            left.width = 10;
            left.height = 10;
            left.depth = 10;

            var right = new Box();
            right.width = 10;
            right.height = 10;
            right.depth = 10;

            var box = right + left;
            Console.WriteLine($"新图形的长{box.height}、宽{box.width}、高{box.depth}");
        }

        class Box
        {
            public int width = 0;
            public int height = 0;
            public int depth = 0;

            // 重载Box类的运算符+ ,使得运算符+作用于box对象时功能变换为长宽高相加
            public static Box operator +(Box left, Box right)
            {
                var box = new Box();
                box.width = left.width + right.width;
                box.depth = left.depth + right.depth;
                box.height = left.height + right.height;
                return box;
            }
        }
    }
}

单目运算符

public static 返回值类型 operator 运算符号(参数类型 参数1)

在c#中,-不止可以作为双目运算符的减号使用,同时可以作为单目运算符取相反数

namespace Demo05
{
    internal class Demo01
    {
        public int x;
        public int y;

        public static Demo01 operator -(Demo01 demo01)
        {
            var demo = new Demo01();
            demo.x = demo01.x = -demo01.x;
            demo.y = demo01.y = -demo01.y;
            return demo;
        }

        public static void Main(string[] args)
        {
            var demo01 = new Demo01();
            demo01.x = 1;
            demo01.y = 2;

            var demo02 = -demo01;
            Console.WriteLine($"x的相反数为:{demo02.x},y的相反数为:{demo02.y}");
        }
    }
}

注:一个程序可以同时存在与单目运算符-和双目运算符-,因为其参数不同,所以是重载到不同的运算符中


类型转换运算符

C#允许将显式类型转换和隐式类型转换看作运算符,并且得到重载功能

重载隐式类型转换

public static implicit operator 目标类型 (类型 待转换对象)

namespace Demo05
{
    internal class Demo02
    {
        public int age = 0;
        public string name = "";

        // 重载隐式类型转换,当对象被直接赋值整型变量时执行此方法
        public static implicit operator Demo02(int age)
        {
            Demo02 d = new Demo02();
            d.age = age;
            return d;
        }

        public static void Main(string[] args)
        {
            var demo02 = new Demo02();
            demo02 = 18;
        }
    }
}
重载显式类型转换

public static explicit operator 目标类型 (类型 待转换对象)

namespace Demo05
{
    internal class Demo02
    {
        public int age = 18;
        public string name = "";

        // 重载显式类型转换,当对象被强转为int型变量时调用此方法
        public static explicit operator int(Demo02 d)
        {
            return d.age;
        }


        public static void Main(string[] args)
        {
            var demo02 = new Demo02();
            int a = (int)demo02;

            Console.WriteLine(a);
        }
    }
}