讀【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) : 點我下載