C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の演算子オーバーロードとは?使い方とサンプルコードをわかりやすく解説

C#における演算子のオーバーロード(Operator Overloading)とは、既存の演算子(+、-、== など)に対して、ユーザー定義型(クラスや構造体)向けの独自の動作を定義できる機能です。オーバーロードされた演算子は、特別な名前を持つ関数として扱われ、operator キーワードの後に定義したい演算子の記号を続けて宣言します。通常の関数と同様に、戻り値の型とパラメータリストも必要です。

オーバーロードできる演算子・できない演算子の一覧

C#では、すべての演算子がオーバーロードできるわけではありません。以下の表に、オーバーロードの可否をまとめました。

No.演算子と説明
1+、-、!、~、++、--
これらは単項演算子です。1つのオペランドを取り、オーバーロードが可能です。
2+、-、*、/、%
これらは二項演算子です。2つのオペランドを取り、オーバーロードが可能です。
3==、!=、<、>、<=、>=
比較演算子はオーバーロードが可能です。なお、== をオーバーロードする場合は != もセットで定義する必要があります。
4&&、||
条件論理演算子は直接オーバーロードできません。ただし、&|、および truefalse 演算子をオーバーロードすることで間接的に利用できます。
5+=、-=、*=、/=、%=
複合代入演算子はオーバーロードできません。対応する二項演算子(+ など)をオーバーロードしていれば、自動的に機能します。
6=、.、?:、->、new、is、sizeof、typeof
これらの演算子はオーバーロードできません。

演算子のオーバーロードの定義方法

演算子のオーバーロードは、次のように public static 修飾子を付けて定義します。

public static Box operator+(Box b, Box c) { }

ポイントは以下の通りです。

  • 必ず public static として宣言する
  • 戻り値の型には、演算の結果として返す型を指定する
  • 少なくとも1つのパラメータに、そのクラス自身(または構造体)の型を含める必要がある

サンプルプログラム

以下は、Box クラスに + 演算子をオーバーロードし、2つの箱(Box)オブジェクトを加算して新しい箱を作る例です。

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

        // 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 Tester {
        static void Main(string[] args) {
            Box Box1 = new Box();  // Box型の変数Box1を宣言
            Box Box2 = new Box();  // Box型の変数Box2を宣言
            Box Box3 = new Box();  // Box型の変数Box3を宣言
            double volume = 0.0;   // 箱の体積を格納する変数

            // 箱1の寸法を設定
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // 箱2の寸法を設定
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);

            // 箱1の体積を表示
            volume = Box1.getVolume();
            Console.WriteLine("Volume of Box1 : {0}", volume);

            // 箱2の体積を表示
            volume = Box2.getVolume();
            Console.WriteLine("Volume of Box2 : {0}", volume);

            // 2つのオブジェクトを+演算子で加算
            Box3 = Box1 + Box2;

            // 箱3の体積を表示
            volume = Box3.getVolume();
            Console.WriteLine("Volume of Box3 : {0}", volume);
            Console.ReadKey();
        }
    }
}

実行結果

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

まとめ

この例では、Box1 + Box2 という直感的な記述で、各辺の長さを合計した新しい Box オブジェクト(長さ18.0 × 幅20.0 × 高さ15.0)が生成され、その体積5400が出力されました。このように演算子のオーバーロードを活用すると、数値型のような自然な操作を自作クラスに持たせることができ、コードの可読性と表現力が大きく向上します。ただし、演算子の意味から大きく外れた動作を定義するとコードが読みにくくなるため、直感的に理解できる挙動にとどめておくことが重要です。

  1. SQLのEXISTS演算子とは?基本構文と実例で学ぶ使い方

    SQLでは、WHERE句にさまざまな条件を指定することでクエリを柔軟に定義できます。その中でも「特定の条件に一致する行がデータベース内に存在するかどうか」を確認したい場合に便利なのが、EXISTS演算子です。 EXISTS演算子の基本構文 EXISTSは、WHERE句の中でサブクエリ(副問い合わせ)と組み合わせて使用します。基本的な構文は以下の通りです。 SELECT <カラム名> FROM <テーブル1名> WHERE EXISTS ( SELECT <カラム名> FROM <テーブル2名> WHERE <テーブル2の主

  2. 【Android】SQLiteでINTERSECT演算子を使用する方法を解説

    本題に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしましょう。SQLiteは、デバイス上のテキストファイルにデータを保存するオープンソースのSQLデータベースです。AndroidにはSQLiteの実装が標準で組み込まれており、リレーショナルデータベースの機能をすべてサポートしています。また、JDBCやODBCのような接続設定を行わずにデータベースへアクセスできる点も大きな特徴です。この記事では、AndroidのSQLiteでINTERSECT演算子を使用する方法を、サンプルコードとともにわかりやすく解説します。INTERSECT演算子とはINTERSECTは、