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