[C#] 002.使用預設轉型方法 - (C#型別與型別間的4種轉型方法)

讀【157個完美化C#的建議】一書的理解筆記 - 002 。

 

重點: C#中型別轉換有四種,如下表簡要整理:

分類
1. 使用型別的轉換運算子
2. 型別內建的Parse , TryParse, ToString , ToDouble 等
3. 幫助類提供的方法
4. CLR (Common Language Runtime 通用語言運行庫)支援的轉型

1. 使用型別的轉換運算子

分成兩種 

1.1 型別轉換運算子 

int testA = 0;
float testB = 0;
testB  = testA;     //隱式轉型 - 轉為浮點數;
testA  = (int)testB;//顯示轉型 - 強制轉為整數

1.2 重載運算子進行型別轉換

using System.Net;//啟用IPAddress型別
//192.168.1.1  = 16777216 + 65536 + 43008 +192
IPAddress ipv4 = new IPAddress(16885952);
//可以使用隱式轉換型別
Ip ipv4_IpClass = "192.168.1.1";

其中最後一行的Ip 是自定義型別,詳細程式碼如下

        /// <summary>
        /// 建立一個IP類別
        /// </summary>
        public class Ip
        {
            /// <summary>
            /// 屬性
            /// </summary>
            private IPAddress ipv4;

            /// <summary>
            /// 建構式 - 將傳進來的String IP 轉為 IPAddress
            /// </summary>
            /// <param name="inputIp"></param>
            public Ip(string inputIp)
            {
                this.ipv4 = IPAddress.Parse(inputIp);
            }
            /// <summary>
            /// 建立隱式轉型 - 可以接受String 型別
            /// </summary>
            /// <param name="inputIp"></param>
            public static implicit operator Ip(string inputIp)
            {
                Ip iptemp = new Ip(inputIp);
                return iptemp;
            }
            /// <summary>
            /// 重載運算子 - 複寫ToString()方法
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return this.ipv4.ToString()+ "12";
            }
        }

關鍵點是以下,static implicit opreator Ip,擴充了該類別的隱式型別轉型功能

            /// <summary>
            /// 建立隱式轉型 - 可以接受String 型別
            /// </summary>
            /// <param name="inputIp"></param>
            public static implicit operator Ip(string inputIp)
            {
                Ip iptemp = new Ip(inputIp);
                return iptemp;
            }

 

2. 型別內建的Parse , TryParse, ToString , ToDouble 等

這就很常使用了,很廣泛的用法。

int a = int.Parse("91");
double b = double.Parse("1.23");

3. 幫助類提供的方法

以下Ip2 是自定義的型別,繼承了 IConvertible 介面,使得任何.ToString() 、.ToInt() 、.ToDouble() 都可以擴充定義

Ip2 test = new Ip2();
string result =  test.ToString();

Ip2詳細繼承,共需實作 19項

        public class Ip2 : IConvertible
        {
            public TypeCode GetTypeCode()
            {
                throw new NotImplementedException();
            }

            public bool ToBoolean(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public byte ToByte(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public char ToChar(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public DateTime ToDateTime(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public decimal ToDecimal(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public double ToDouble(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public short ToInt16(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public int ToInt32(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public long ToInt64(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public sbyte ToSByte(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public float ToSingle(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public string ToString(IFormatProvider provider)
            {
                return "123";
                //throw new NotImplementedException();
            }

            public object ToType(Type conversionType, IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public ushort ToUInt16(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public uint ToUInt32(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }

            public ulong ToUInt64(IFormatProvider provider)
            {
                throw new NotImplementedException();
            }
        }

4. CLR (Common Language Runtime 通用語言運行庫)支援的轉型

簡單來說就是: 子類別繼承父類別就會內建有 【隱式轉型的功能】

類別 關係
animal 父類別
dog 子類別 - 繼承animal
cat 子類別 - 繼承animal

以下是類別的基本定義

        /// <summary>
        /// 動物類別 - 這邊範例做為父類別
        /// </summary>
        public class animal
        {

        }

        /// <summary>
        /// 狗類別(子) - 這邊繼承animal類別
        /// </summary>
        public class dog : animal
        {

        }

        /// <summary>
        /// 貓類別(子) - 這邊繼承animal類別
        /// </summary>
        public class cat : animal
        {

        }
        #endregion

程式碼實作可以發現子類別可以隱式轉型為父類別

但是父類別只可以顯示強制轉型為子類別

animal main = new animal();
dog Samoyed = new dog();
main = Samoyed;
Samoyed = (dog)main;

github連結(Vs2015) : 點我下載