「演算子をオーバーロード」などと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:
コメントを投稿