C#ユーザ定義タイプ変換の詳細

2958 ワード

C#ユーザ定義タイプ変換
•クラスや構造をカスタマイズするための暗黙的な変換や表示変換が可能である.例えば、カスタムクラスタイプを整数型、浮動小数点型などに変換する、逆も同様である.
C#暗黙的な変換と明示的な変換を提供
•暗黙変換:コンパイラが自動的に変換を実行•暗黙変換:コンパイラが暗黙変換演算子を使用する場合にのみ、変換宣言暗黙変換を実行する構文は次のとおりです.注意:すべてのユーザー定義変換にはpublicおよびstatic修飾子を使用する必要があります.
 
  
public static implicit operator TargetType(SourceType Identifier)
{
       ...
      return ObjectOfTargetType;
}

TargetType:ターゲットタイプ
パラメータIdentitfier:ソースデータ
例えば、次のコードはint字面量を暗黙的にLimitedIntオブジェクトに変換し、逆にLimitedIntは暗黙的にintに変換することもできる
 
  
class LimitedInt
    {
        const int MaxValue = 100;
        const int MinValue = 0;

        private int _theValue = 0;
        //
        public int TheValue
        {
            get { return _theValue; }
            set
            {
                if (value < MinValue)
                {
                    _theValue = 0;
                }
                else
                {
                    _theValue = value > MaxValue ? MaxValue : value;
                }
            }
        }

        // : LimitedInt
        public static implicit operator int(LimitedInt li)
        {
            return li.TheValue;
        }

        // : LimitedInt
        public static implicit operator LimitedInt(int x)
        {
            LimitedInt li = new LimitedInt();
            li.TheValue = x;
            return li;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            LimitedInt li = 500; // 500 LimitedInt

            int value = li;  // LimitedInt int

            Console.WriteLine("li:{0},value:{1}", li.TheValue, value);

            Console.ReadKey();
        }


コード変更出力結果:li:100,value:100
変換および強制変換演算子の表示
前述したのは暗黙的な変換ですが、演算子implcitをexplicitに変更すると、変換を実行するときに変換演算子の使用を表示しなければなりません.
コードクリップは次のとおりです.
 
  
// : LimitedInt
        public static explicit operator int(LimitedInt li)
        {
            return li.TheValue;
        }

        // : LimitedInt
        public static explicit operator LimitedInt(int x)
        {
            LimitedInt li = new LimitedInt();
            li.TheValue = x;
            return li;
        }

        static void Main(string[] args)
        {
            LimitedInt li = (LimitedInt)500; // 500 LimitedInt

            int value = (int)li;  // LimitedInt int

            Console.WriteLine("li:{0},value:{1}", li.TheValue, value);

            Console.ReadKey();
        }