いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-002 (System.Object)

System.Objectは、javajava.lang.Objectと同じく
全ての型の基底クラスです。用意されているメソッドも
ほぼjavaのそれと同じものです。なので、javaの人から
すると分かりやすいですね。


全ての型の基底クラスなだけあって、どのクラスにも
共通する振る舞いが定義されています。


大事なメソッドは、以下の3つ。

  • Equals
  • GetHashCode
  • ToString

Equalsは、そのオブジェクトと他方のオブジェクトが同値であるかどうかに
使用するもの、GetHashCodeはそのオブジェクトのハッシュ値を返すもの、ToStringメソッドは
そのオブジェクトの文字列表現を返すものです。


自分で型を作成した場合、上記3つを必ずオーバーライドする
必要はないですが、ToString()はオーバーライドしておいた
方がデバッグの際にも楽です。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// System.Objectについてのサンプルクラスです.
    /// </summary>
    /// <remarks>
    /// System.Objectは、Javaの場合と同じく全てのオブジェクトの
    /// 基底クラスです。どのクラスも例外なくSystem.Objectのサブクラスと
    /// なります。
    /// </remarks>
    public class ObjectResearch00 : IExecutable{

        /// <summary>サンプル用のフィールド</summary>
        int    _id;
        /// <summary>サンプル用のフィールド</summary>
        string _name;

        /// <summary>
        /// サンプル用のプロパティです。
        /// </summary>
        public int Id{
            get{
                return _id;
            }
            set{
                _id = value;
            }
        }

        /// <summary>
        /// サンプル用のプロパティです。
        /// </summary>
        public string Name{
            get{
                return _name;
            }
            set{
                _name = value;
            }
        }

        /// <summary>
        /// 処理を実行します。
        /// </summary>
        public void Execute(){
            ObjectResearch00 obj1 = new ObjectResearch00();
            ObjectResearch00 obj2 = new ObjectResearch00();
            ObjectResearch00 obj3 = new ObjectResearch00();

            obj1.Id = 1;
            obj1.Name = "gsf_zero1";

            obj2.Id = 2;
            obj2.Name = "gsf_zero2";

            obj3.Id = 3;
            obj3.Name = "gsf_zero1";

            //
            // Equalsによる同値確認.
            //
            Console.WriteLine("obj1とobj1をEquals : " + obj1.Equals(obj1));
            Console.WriteLine("obj1とobj2をEquals : " + obj1.Equals(obj2));
            Console.WriteLine("obj1とobj3をEquals : " + obj1.Equals(obj3));

            //
            // GetHashCodeの出力.
            //
            Console.WriteLine("obj1のGetHashCode : " + obj1.GetHashCode());
            Console.WriteLine("obj2のGetHashCode : " + obj2.GetHashCode());
            Console.WriteLine("obj3のGetHashCode : " + obj3.GetHashCode());

            //
            // ToStringの出力.
            //
            Console.WriteLine("obj1のToString : " + obj1);
            Console.WriteLine("obj2のToString : " + obj2);
            Console.WriteLine("obj3のToString : " + obj3);
        }

        /// <summary>
        /// System.Object#Equalsのオーバーライドです。
        /// </summary>
        public override bool Equals(object obj){
            //
            // Equalsの実装についての注意点に関しては、MSDNのSystem.Object#Equalsの
            // ドキュメントを参照してください。
            //
            // 決まり事的には、javaでのequalsメソッド実装の際と大体同じイメージです。
            //

            //
            // まず、型変換できるように値のチェック.
            //
            if(obj == null || obj.GetType() != GetType()){
                return false;
            }

            ObjectResearch00 other = (ObjectResearch00) obj;

            //
            // IDの値が一致する場合、同値とみなす.
            //
            return (Id == other.Id);

        }

        /// <summary>
        /// System.Object#GetHashCodeのオーバーライドです。
        /// </summary>
        public override int GetHashCode(){
            //
            // GetHashCodeの実装についての注意点に関しては、MSDNのSystem.Object#GetHashCodeの
            // ドキュメントを参照してください。
            //
            // 決まり事的には、javaでのequalsメソッド実装の際と大体同じイメージです。
            //
            // Javaの場合と同じく、EqualsをオーバーライドしたらGetHashCodeもオーバーライドしましょう。
            //
            
            //
            // Idの値は一意であると仮定.
            //
            return Id.GetHashCode();
        }

        /// <summary>
        /// System.Object#ToStringのオーバーライドです。
        /// </summary>
        /// <remarks>
        /// オブジェクトの文字列表現を返します.
        /// </remarks>
        public override string ToString(){
            return string.Format("{0}[Id={1}, Name={2}]", GetType().FullName, Id, Name);
        }

    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。