演算子/インデクサ

スポンサーリンク

演算子

次のプログラムは,座標 (x, y) を表現するクラス Point を定義したものです。
演算子 + を定義しています。

using System;

// 座標 (x, y) を表す
class Point
{
    public double X;
    public double Y;

    public Point(double x, double y)
    {
        X = x; Y = y;
    }

    // 演算子 + を定義
    public static Point operator+ (Point p1, Point p2)
    {
        return new Point(p1.X + p2.X, p1.Y + p2.Y);
    }
}

class Program
{
    static void Main()
    {
        Point p1 = new Point(2, 3);
        Point p2 = new Point(5, 6);
        Point p3 = p1 + p2;
        Console.WriteLine(p3.X);  // 出力: 7
        Console.WriteLine(p3.Y);  // 出力: 9
    }
}

演算子の定義は,メソッドの形式で次のように書きます。
修飾子は常に public static で,メソッド名は operator 演算子 とします。

// 単項演算子
public static 返却型 operator 演算子 (1 オペランド1)
{ ... }

// 二項演算子
public static 返却型 operator 演算子 (1 オペランド1, 2 オペランド2)
{ ... }

インデクサ

インデクサ (indexer) を定義すると,一般のオブジェクトをあたかも配列であるかのように扱うことができます。
次のプログラムは,名簿を表すクラス NameList にインデクサを定義したものです。

using System;

// 名簿を表現
class NameList
{
    private string[] list = new string[128];

    // インデクサ
    public string this[int index]
    {
        get { return list[index]; }
        set { list[index] = value; }
    }
}

class Program
{
    static void Main()
    {
        NameList list = new NameList();
        list[0] = "大島";
        list[1] = "片桐";
        Console.WriteLine(list[0]);  // 出力: 大島
        Console.WriteLine(list[1]);  // 出力: 片桐
    }
}

インデクサの定義は,名称を this[型 添字子] とするプロパティの形式で書きます。
get アクセサ,set アクセサの書き方はプロパティと変わりありません。

スポンサーリンク