C# 的类型转换分为隐式和显式转换,隐式转换自动进行而不丢失数据,显式转换需要强制转换,可能导致数据丢失。
隐式转换只能由低精度向高精度转换,自动进行而不丢失数据。
// 只能转换同一类的类型,如果类型之间没有联系,则不能转换
var1 = (destinationType)var2;
简单显式转换易造成数据丢失,比如 short 型的变量 281,放到 byte 型中,就会变成 25,以下方法可以检查转换时是否有丢失。
// checked() 专门可以用来检查类型转换时是否有数据丢失
// 如果在转换过程中发生溢出,将抛出 OverflowException 异常
var1 = checked((byte)var2);
// unchecked() 指定不检查类型转换时是否有数据丢失
var1 = unchecked((byte)var2);
VISUAL STUDIO 中设置项目中的类型转换,检查是否有类型丢失:在项目上右键--->属性--->生成--->高级--->勾选“检查运算上溢/下溢”
Convert.ToBoolean(val); // val 转换为 bool
Convert.ToByte(val); // val 转换为 byte
Convert.ToChar(val); // val 转换为 char
Convert.ToDecimal(val); // val 转换为 decimal
Convert.ToDouble(val); // val 转换为 double
Convert.ToInt16(val); // val 转换为 short
// val 转换为 int,不完全遵守四舍五入,当 val 的第 1 位小数大于等于 5 时,如果 val 在两个整数之间的,则返回二者种的偶数
Convert.ToInt32(val);
Convert.ToInt32(4.3); // 返回 4
Convert.ToInt32(4.5); // 返回 4
Convert.ToInt32(5.5); // 返回 6
Convert.ToInt64(val); // val 转换为 long
Convert.ToSByte(val); // val 转换为 sbyte
Convert.ToSingle(val); // val 转换为 float
Convert.ToString(val); // val 转换为 string
Convert.ToUInt16(val); // val 转换为 ushort
Convert.ToUInt32(val); // val 转换为 Uint
Convert.ToUInt64(val); // val 转换为 Ulong
// 此方法无法将 string 为 int,只能将数值转换为 int
var1 = (int)var2;
var1 = (decimal)var2;
var1 = (char)var2;
// 可以将 string 转为 int,但其不能转换空值(null,而不是""),会报错
var1 = int.parse(var2);
var1 = decimal.parse(var2);
// 可以将 string 转为 int,能将空值(null,而不是"")转成 0
var1 = Convert.ToInt32(var2);
var1 = Convert.ToDouble(var2);
// 所有的值类型都有一个内置的 ToString() 方法,通过这个方法,可以把所有值类型都转换为字符串类型
var1 = var2.ToString();
// 将日期格式的变量 var2,转换成 "yyyyMMdd" 格式的字符串,其中 yyyy 和 dd 必须小写,MM 必须大写,因为 MM 大写代表获取月份,小写代表获取分钟
var1 = var2.ToString("yyyyMMdd");
隐式和显式类型转换属于不同值类型之间的转换,而如果要在值类型和引用类型之间转换,就需要了解装箱和拆箱的操作。
int a = 0;
Object obj = a; // 装箱
int b = (int)obj; // 拆箱
int i;
// Int32.TryParse 是一个方法,用于尝试将字符串转换为 int 类型
// out i 表示如果转换成功,结果将存储在变量 i 中
// 如果成功转换,TryParse 返回 true,;如果转换失败,返回 false
if (Int32.TryParse(TextBox1.Text,out i))
{
}