[C# class] クラスメンバーの演算子(operator)について

今回はクラスメンバーの演算子についてです。
クラスで演算子をオーバーロードすると、クラスに+などの演算子を使ったときにどのような処理をするのか?というのを決めることが出来ます。

クラスってなに?という方はこちらを見てください。

また、演算子ってどういうのがあるの?という方はこちらを見てください。

スポンサーリンク

演算子のオーバーロードの仕方

こんな感じに書きます。
引数の数は単項演算子の場合1つ、2項演算子の場合2つになります。

public static 戻り値の型 operator 演算子(引数)
{
    // ここに演算子に応じた処理を書く
}

ちなみにオーバーロードは同じ名前だけど引数や戻り値が違うものを定義することをいいます。この場合、C#が決めた演算子を使った処理(数値 + 数値 など)以外の処理(クラス + クラス など)を定義することをいいます。

例えば、+演算子を定義する場合、こんな感じになります。

using System;

// メインプログラム
class Program
{
    public static void Main()
    {
        // 2次元ベクトルクラスを作成
        Vector2 v1 = new Vector2 { X = 10, Y = 20 };
        Vector2 v2 = new Vector2 { X = 12, Y = 18 };

        // ベクトルクラスどうしの演算
        Vector2 vPlus = v1 + v2;

        // 結果の表示
        Console.WriteLine($"vPlus.X = {vPlus.X}, vPlus.Y = {vPlus.Y}");
    }
}

// 2次元ベクトルクラス
class Vector2
{
    // プロパティ(X座標)
    public double X { get; set; }
    // プロパティ(Y座標)
    public double Y { get; set; }

    // +演算子の定義(Vector2型 + Vector2型 の時に呼ばれる)
    public static Vector2 operator +(Vector2 v1, Vector2 v2)
    {
        // X、Yそれぞれの座標同士を足した新しいVector2を作成して返す
        return new Vector2 { X = v1.X + v2.X, Y = v1.Y + v2.Y };
    }
}
vPlus.X = 22, vPlus.Y = 38

{ }内の処理が1つの場合、=> を使って { }returnを省略することが出来ます。

public static Vector2 operator +(Vector2 v1, Vector2 v2) => new Vector2 { X = v1.X + v2.X, Y = v1.Y + v2.Y };
スポンサーリンク

式によって呼ばれる演算子の処理を切り替える

上のサンプルではクラスどうしの演算でしたが、他の組み合わせも定義することができ、式によってよばれる処理を変えることができます。

using System;

// メインプログラム
class Program
{
    public static void Main()
    {
        // 2次元ベクトルクラスを作成
        Vector2 v1 = new Vector2 { X = 10, Y = 20 };
        Vector2 v2 = new Vector2 { X = 12, Y = 18 };

        // ベクトルクラス同士の演算
        Vector2 vPlus1 = v1 + v2;
        Console.WriteLine($"v1 + v2 の結果:vPlus.X = {vPlus1.X}, vPlus.Y = {vPlus1.Y}");

        // ベクトルクラスと数値の演算
        Vector2 vPlus2 = v1 + 100;
        Console.WriteLine($"v1 + 100の結果:vPlus.X = {vPlus2.X}, vPlus.Y = {vPlus2.Y}");
    }
}

// 2次元ベクトルクラス
class Vector2
{
    // プロパティ(X座標)
    public double X { get; set; }
    // プロパティ(Y座標)
    public double Y { get; set; }

    // +演算子のオーバーロード(Vector2型 + Vector2型 の時に呼ばれる)
    public static Vector2 operator +(Vector2 v1, Vector2 v2)
    {
        return new Vector2 { X = v1.X + v2.X, Y = v1.Y + v2.Y };
    }
    // +演算子のオーバーロード(Vector2型 + double型 の時に呼ばれる)
    public static Vector2 operator +(Vector2 v1, double value)
    {
        return new Vector2 { X = v1.X + value, Y = v1.Y + value };
    }
}
v1 + v2 の結果:vPlus.X = 22, vPlus.Y = 38
v1 + 100の結果:vPlus.X = 110, vPlus.Y = 120
スポンサーリンク

オーバーロードできる演算子

クラスに定義できる演算子はこんな感じです。
C#の公式ドキュメントも合わせて参照してみてください。

単項演算子
+ – ! ~ ++ — true false

2項演算子
+ – * / % & | ^ << >>
※以下はペアでオーバーロードする必要がある
== !=
< >
<= >=


C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました