演算子(operator)をイジるのイイ感じ - C#

「演算子をオーバーロード」などとMSDNにあるのですが、「operator string」がイイ感じなんで機会があればぜひ。

その前にToStringをoverrideしておくと更に分かりやすいので以下のようにしました。

public override string ToString()
{
    return this.Age.ToString();
}

stringとの比較に使用される値を定義します。
public static implicit operator string(Datum x)
{
    return x.ToString();
}

これはd3というオブジェクトと文字列"1"を比較しています。
Console.WriteLine("string. {0}",d3 == "1");
「d3.Age」の値が「1」の場合、trueが返ります。

キャストや「Convert.ToInt32」などとしなくとも比較できるようになります。
例えば、
if (datum == textBox1.Text)
{
    //...
}
などということも可能になります。


更にintで比較する場合も定義してみました。
public static implicit operator int(Datum x)
{
    return x.Age;
}

Console.WriteLine("int. {0}", d3 == 1);
「d3.Age」の値が「1」の場合、trueが返ります。


その他、実際に試して、「+」 や「++」をoverroadした際の挙動を確認し、正しく動作する書き方は以下の通りとなりました。

Sample Code

using System;

namespace ConsoleApplication1
{
    class Datum
    {
        #region フィールド
        int _age;
        string _name;
        #endregion

        #region コンストラクタ
        public Datum()
        {
            _age = 0;
            _name = string.Empty;
        }

        public Datum(int age)
        {
            _age = age;
            _name = string.Empty;
        }

        public Datum(int age, string name)
        {
            _age = age;
            _name = name;
        }
        #endregion


        #region プロパティ
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        #endregion


        public static implicit operator string(Datum x)
        {
            return x.ToString();
        }

        public static implicit operator int(Datum x)
        {
            return x.Age;
        }


        public static Datum operator +(Datum datum1, Datum datum2)
        {
            //これは×
            //return new Datum(datum1.Age + datum2.Age, datum1.Name);

            Datum tmp = new Datum(datum1.Age + datum2.Age, datum1.Name);
            //or Datum tmp = new Datum(datum1.Age + datum2.Age, datum1.Name + datum2.Name);
            return tmp;
        }

        public static Datum operator ++(Datum datum)
        {
            //これは×
            //datum.Age++;
            //return datum;

            //これは×
            //datum.Age = datum.Age + 1;
            //return datum;

            //これは一応○
            //Datum tmp = new Datum(datum.Age + 1, datum.Name);
            //return tmp;

            return new Datum(datum.Age + 1, datum.Name);
        }

        public override string ToString()
        {
            return this.Age.ToString();
        }
    }
}

Test

class Program
{
    static void Main(string[] args)
    {
        Datum d1 = new Datum();
        d1.Age = 1;
        Datum t1 = d1++;
        Console.WriteLine("d1 = {0}", d1);
        Console.WriteLine("t1 = {0}", t1);
        

        Datum d2 = new Datum();
        d2.Age = 1;
        Datum t2 = ++d2;
        Console.WriteLine("d2 = {0}", d2);
        Console.WriteLine("t2 = {0}", t2);


        Datum d3 = new Datum(1,string.Empty);
        Console.WriteLine("string. {0}",d3 == "1");
        Console.WriteLine("int. {0}", d3 == 1);

        Console.ReadLine();
    }
}

Result

d1 = 2
t1 = 1
d2 = 2
t2 = 2
string. True
int. True

0 Comments:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts