プログラミング言語 C Shape C# 演算子のオーバーロード

C# 演算子のオーバーロード

 
C# は演算子のオーバーロードをサポートしています。いわゆる演算子のオーバーロードとは、カスタム型を使用して C# のほとんどの演算子の機能を再定義できることを意味します。演算子のオーバーロードは、演算子キーワードの後に​​演算子を続けることで定義する必要があります。再定義された演算子は、特別な名前を持つ関数とみなすことができます。他の関数と同様に、この関数にも、次のような戻り値の型とパラメータ リストがあります。 :

 

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;
}

上記の関数は、加算演算子+のオーバーロードを実装します。これは 2 つの Box オブジェクトのプロパティを必要とし、Box オブジェクトを返します。

演算子のオーバーロードの実装

演算子のオーバーロードを示す完全な例を次に示します。

 using System;

namespace it-kiso.com
{
    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;
        }
        // 重載 + 演算子、2つの 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 Demo
    {
        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);

            // 2つのオブジェクトを足し合わせる
            Box3 = Box1 + Box2;

            // Box3の体積
            volume = Box3.getVolume();
            Console.WriteLine("Box3の体積: {0}", volume);
            Console.ReadKey();
        }
    }
} 

操作の結果は次のようになります。

Box1の体積: 210
Box2の体積: 1560
Box3の体積: 5400

オーバーロード可能な演算子とオーバーロード不可能な演算子

次の表に、C# 演算子のオーバーロード可能性に関する情報を示します。

オペレーター リロード可能性
+、-、!、~、++、– これらの単項演算子はオーバーロードできる
+、-、*、/、%、&、|、^、<<、>>、=、!=、<、>、<=、>= これらの二項演算子はオーバーロードできます。一部の演算子はペアでオーバーロードする必要があることに注意してください。
&&、||  論理演算子をオーバーロードできません
(type)var_name キャスト演算子はオーバーロードできません
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=     複合代入演算子は明示的にオーバーロードできません。ただし、二項演算子をオーバーロードすると、対応する複合代入演算子も暗黙的にオーバーロードされます。たとえば、 +演算子も+=で暗黙的にオーバーロードされます。
^、=、.、?.、?  :  、??、??=、..、->、=>、as、await、checked、unchecked、default、delegate、is、nameof、new、sizeof、stackalloc、switch、typeof   これらの演算子はオーバーロードできません

注: 比較演算子はペアでオーバーロードする必要があります。つまり、ペアのいずれかの演算子がオーバーロードされた場合、もう一方の演算子もオーバーロードする必要があります。たとえば==演算子と!=演算子、 <演算子と>演算子、 <=演算子と>=演算子などです。

【例】具体的な例で説明しましょう。

 using System;

namespace it-kiso.com
{
    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 override bool Equals(object o)
        {
            if(o==null) return false;
            if(GetType() != o.GetType()) return false;
            return true;
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        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 Demo
    {
        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() を使用して二つの Box を表示
            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);

            // Box の比較
            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();
        }
    }
} 

「 C# 演算子のオーバーロード」についてわかりやすく解説!絶対に観るべきベスト2動画

演算子のオーバーロード [C++ライブ]
C++ 10.演算子のオーバーロード