C# 类型转换
在 C# 中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。
C# 中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称为强制类型转换)。
隐式类型转换
隐式转换是不需要编写代码来指定的转换,编译器会自动进行。
隐式转换是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。
例如,从 int 到 long,从 float 到 double 等。
从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个 byte 类型的变量赋值给 int 类型的变量,编译器会自动将 byte 类型转换为 int 类型,不需要显示转换。
实例
int i = b; // 隐式转换,不需要显式转换
将一个整数赋值给一个长整数,或者将一个浮点数赋值给一个双精度浮点数,这种转换不会导致数据丢失:
实例
long longValue = intValue; // 隐式转换,从 int 到 long
显式转换
显式类型转换,即强制类型转换,需要程序员在代码中明确指定。
显式转换是指将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失。
例如,将一个 int 类型的变量赋值给 byte 类型的变量,需要显示转换。
实例
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号
强制转换为整数类型:
实例
int intValue = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分
强制转换为浮点数类型:
实例
float floatValue = (float)intValue; // 强制从 int 到 float,数据可能损失精度
强制转换为字符串类型:
实例
string stringValue = intValue.ToString(); // 将 int 转换为字符串
下面的实例显示了一个显式的类型转换:
实例
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// 强制转换 double 为 int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
5673
C# 类型转换方法
C# 提供了下列内置的类型转换方法:
序号 | 方法 & 描述 |
---|---|
1 | ToBoolean 如果可能的话,把类型转换为布尔型。 |
2 | ToByte 把类型转换为字节类型。 |
3 | ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
4 | ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
5 | ToDecimal 把浮点型或整数类型转换为十进制类型。 |
6 | ToDouble 把类型转换为双精度浮点型。 |
7 | ToInt16 把类型转换为 16 位整数类型。 |
8 | ToInt32 把类型转换为 32 位整数类型。 |
9 | ToInt64 把类型转换为 64 位整数类型。 |
10 | ToSbyte 把类型转换为有符号字节类型。 |
11 | ToSingle 把类型转换为小浮点数类型。 |
12 | ToString 把类型转换为字符串类型。 |
13 | ToType 把类型转换为指定类型。 |
14 | ToUInt16 把类型转换为 16 位无符号整数类型。 |
15 | ToUInt32 把类型转换为 32 位无符号整数类型。 |
16 | ToUInt64 把类型转换为 64 位无符号整数类型。 |
这些方法都定义在 System.Convert 类中,使用时需要包含 System 命名空间。它们提供了一种安全的方式来执行类型转换,因为它们可以处理 null值,并且会抛出异常,如果转换不可能进行。
例如,使用 Convert.ToInt32 方法将字符串转换为整数:
string str = "123"; int number = Convert.ToInt32(str); // 转换成功,number为123
如果字符串不是有效的整数表示,Convert.ToInt32 将抛出 FormatException。
下面的实例把不同值的类型转换为字符串类型:
实例
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
// 定义一个整型变量
int i = 75;
// 定义一个浮点型变量
float f = 53.005f;
// 定义一个双精度浮点型变量
double d = 2345.7652;
// 定义一个布尔型变量
bool b = true;
// 将整型变量转换为字符串并输出
Console.WriteLine(i.ToString());
// 将浮点型变量转换为字符串并输出
Console.WriteLine(f.ToString());
// 将双精度浮点型变量转换为字符串并输出
Console.WriteLine(d.ToString());
// 将布尔型变量转换为字符串并输出
Console.WriteLine(b.ToString());
// 等待用户按键后关闭控制台窗口
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
75 53.005 2345.7652 True
在进行类型转换时需要注意以下几点:
- 隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型;
- 显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查;
- 对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查。
类型转换方法
C# 提供了多种类型转换方法,例如使用 Convert 类、Parse 方法和 TryParse 方法,这些方法可以帮助处理不同的数据类型之间的转换。
使用 Convert 类
Convert 类提供了一组静态方法,可以在各种基本数据类型之间进行转换。
实例
int num = Convert.ToInt32(str);
使用 Parse 方法
Parse 方法用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。
实例
double d = double.Parse(str);
使用 TryParse 方法
TryParse 方法类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。
实例
double d;
bool success = double.TryParse(str, out d);
if (success) {
Console.WriteLine("转换成功: " + d);
} else {
Console.WriteLine("转换失败");
}
自定义类型转换
C# 还允许你定义自定义类型转换操作,通过在类型中定义 implicit 或 explicit 关键字。
实例
public class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees)
{
Degrees = degrees;
}
// 隐式转换从Fahrenheit到double
public static implicit operator double(Fahrenheit f)
{
return f.Degrees;
}
// 显式转换从double到Fahrenheit
public static explicit operator Fahrenheit(double d)
{
return new Fahrenheit(d);
}
}
public class Program
{
public static void Main()
{
Fahrenheit f = new Fahrenheit(98.6);
Console.WriteLine("Fahrenheit object: " + f.Degrees + " degrees");
double temp = f; // 隐式转换
Console.WriteLine("After implicit conversion to double: " + temp + " degrees");
Fahrenheit newF = (Fahrenheit)temp; // 显式转换
Console.WriteLine("After explicit conversion back to Fahrenheit: " + newF.Degrees + " degrees");
}
}
以上例子中,我们定义了一个 Fahrenheit 类,并实现了从 Fahrenheit 到 double 的隐式转换和从 double 到 Fahrenheit 的显式转换。
输出结果将显示如下:
Fahrenheit object: 98.6 degrees After implicit conversion to double: 98.6 degrees After explicit conversion back to Fahrenheit: 98.6 degrees
总结
在 C# 中,内置的类型转换方法主要通过以下几种方式实现:隐式转换、显式转换(强制转换)、使用 Convert 类的方法、Parse 方法和 TryParse 方法,这些方法广泛应用于不同数据类型之间的转换。
以下是 C# 内置类型转换方法的表格:
方法类别 | 方法 | 描述 |
---|---|---|
隐式转换 | 自动进行的转换 | 无需显式指定,通常用于安全的类型转换,如从较小类型到较大类型 |
显式转换(强制转换) | (type)value | 需要显式指定,通常用于可能导致数据丢失或转换失败的情况 |
Convert 类方法 | Convert.ToBoolean(value) | 将指定类型转换为 Boolean |
Convert.ToByte(value) | 将指定类型转换为 Byte | |
Convert.ToChar(value) | 将指定类型转换为 Char | |
Convert.ToDateTime(value) | 将指定类型转换为 DateTime | |
Convert.ToDecimal(value) | 将指定类型转换为 Decimal | |
Convert.ToDouble(value) | 将指定类型转换为 Double | |
Convert.ToInt16(value) | 将指定类型转换为 Int16 (短整型) | |
Convert.ToInt32(value) | 将指定类型转换为 Int32 (整型) | |
Convert.ToInt64(value) | 将指定类型转换为 Int64 (长整型) | |
Convert.ToSByte(value) | 将指定类型转换为 SByte | |
Convert.ToSingle(value) | 将指定类型转换为 Single (单精度浮点型) | |
Convert.ToString(value) | 将指定类型转换为 String | |
Convert.ToUInt16(value) | 将指定类型转换为 UInt16 (无符号短整型) | |
Convert.ToUInt32(value) | 将指定类型转换为 UInt32 (无符号整型) | |
Convert.ToUInt64(value) | 将指定类型转换为 UInt64 (无符号长整型) | |
Parse 方法 | Boolean.Parse(string) | 将字符串解析为 Boolean |
Byte.Parse(string) | 将字符串解析为 Byte | |
Char.Parse(string) | 将字符串解析为 Char | |
DateTime.Parse(string) | 将字符串解析为 DateTime | |
Decimal.Parse(string) | 将字符串解析为 Decimal | |
Double.Parse(string) | 将字符串解析为 Double | |
Int16.Parse(string) | 将字符串解析为 Int16 | |
Int32.Parse(string) | 将字符串解析为 Int32 | |
Int64.Parse(string) | 将字符串解析为 Int64 | |
SByte.Parse(string) | 将字符串解析为 SByte | |
Single.Parse(string) | 将字符串解析为 Single | |
UInt16.Parse(string) | 将字符串解析为 UInt16 | |
UInt32.Parse(string) | 将字符串解析为 UInt32 | |
UInt64.Parse(string) | 将字符串解析为 UInt64 | |
TryParse 方法 | Boolean.TryParse(string, out bool) | 尝试将字符串解析为 Boolean ,返回布尔值表示是否成功 |
Byte.TryParse(string, out byte) | 尝试将字符串解析为 Byte ,返回布尔值表示是否成功 | |
Char.TryParse(string, out char) | 尝试将字符串解析为 Char ,返回布尔值表示是否成功 | |
DateTime.TryParse(string, out DateTime) | 尝试将字符串解析为 DateTime ,返回布尔值表示是否成功 | |
Decimal.TryParse(string, out decimal) | 尝试将字符串解析为 Decimal ,返回布尔值表示是否成功 | |
Double.TryParse(string, out double) | 尝试将字符串解析为 Double ,返回布尔值表示是否成功 | |
Int16.TryParse(string, out short) | 尝试将字符串解析为 Int16 ,返回布尔值表示是否成功 | |
Int32.TryParse(string, out int) | 尝试将字符串解析为 Int32 ,返回布尔值表示是否成功 | |
Int64.TryParse(string, out long) | 尝试将字符串解析为 Int64 ,返回布尔值表示是否成功 | |
SByte.TryParse(string, out sbyte) | 尝试将字符串解析为 SByte ,返回布尔值表示是否成功 | |
Single.TryParse(string, out float) | 尝试将字符串解析为 Single ,返回布尔值表示是否成功 | |
UInt16.TryParse(string, out ushort) | 尝试将字符串解析为 UInt16 ,返回布尔值表示是否成功 | |
UInt32.TryParse(string, out uint) | 尝试将字符串解析为 UInt32 ,返回布尔值表示是否成功 | |
UInt64.TryParse(string, out ulong) | 尝试将字符串解析为 UInt64 ,返回布尔值表示是否成功 |
Jennis
jen***tian@gmail.com
隐式转换和显式转换
隐式转换:C# 默认的以安全方式进行的转换。本质是从小存储容量数据类型自动转换为大存储容量数据类型,从派生类转换为基类。
实例:
显式转换:通过用户使用预定义的函数显式完成的,显式转换需要强制转换运算符。
转换类型的范围大小和从属关系和隐式转换相反。显式转换可能会导致数据出错,或者转换失败,甚至无法编译成功。
实例:
运行结果:
Jennis
jen***tian@gmail.com
xity
xit***q.com
类型之间的转换 - Convert 和 Parse
xity
xit***q.com
mmdream
404***450@qq.com
该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。
结果输出:
mmdream
404***450@qq.com
代码小白
dre***w@qq.com
C# 中对 double 类型的数据取整,可以使用 convert.toint32() 方法,也可使用 int 强制转换为整数,使用 int 时并不存在四舍五入的情况,而是直接将后面的小数位数丢掉。比如:
程序运行结果如下:
代码小白
dre***w@qq.com
埃里克
306***6105@qq.com
Convert.ToInt32() 与 int.Parse() 的区别
没搞清楚 Convert.ToInt32 和 int.Parse() 的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从 url 中取一个参数 page 的值,我们知道这个值是一个 int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以用 int.Parse(Request.QueryString["page"]),但是如果 page 这个参数在 url 中不存在,那么前者将返回 0,0 可能是一个有效的值,所以你不知道 url 中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有 page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做 0 来处理。
(1) 这两个方法的最大不同是它们对 null 值的处理方法: Convert.ToInt32(null) 会返回 0 而不会产生任何异常,但 int.Parse(null) 则会产生异常。
(2) 对数据进行四舍五入时候的区别
(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象, 你想把它转换为 int, 用 int.Parse 就不可以, 要用 Convert.ToInt32。
埃里克
306***6105@qq.com
yjcyd
519***142@qq.com
浅谈 string 转 int 与抛异常
string 字符串类型和 int 也是可以转换的。下一行的代码给出错误的转换方法。
上述代码,毋庸置疑,肯定是错误的。VS 在编译时就过不了。那么,string 该怎么转换成 int 呢?
这里,我们需要用到 int.Parse(),核心代码为:
如果仅仅是这样,是没有问题的,但是,我们下面再来做一个实例。
用户输入一个数字,而电脑将计算出这个数字加上1以后的答案,并且显示出来。
用户输入的东西,即 Console.ReadLine() ,一定是以字符串形式表现的。
于是,运用之前的方法,我们可以写出以下的代码:
当程序运行时,会出现:
这样就很完美了吗?不!!
如果用户输入并非数字的其他字符,如汉字,会发生什么情况?
此时,用户输入 王 ,显然,程序将无法继续运行下去,因为int类型只能存整数,不能存字符。
这时,程序就会抛出异常。
如果用 VS 编,你还会看到异常类型:FormatException。
所以,为了保险,可以用try、catch来解决此问题。核心代码为:
try 在英语中就是尝试的意思。在这段代码中,try{} 部分,顾名思义,也就是去尝试进行下面的代码。catch{} 部分,则是检测异常。这样,在出现异常时,catch 就能捕获到异常,从而程序并不会停止。
则这段程序,完整的代码应该为:
这样,如果我输入了 王 ,程序结果为:
yjcyd
519***142@qq.com
crespo
wq6***522@163.com
参考地址
1)对于转换对象,Convert.ToInt32() 可以为多种类型(例出数字类型外 bool,DateTime 等),int.TryParse() 和 int.Parse() 只能是整型字符串类型(即各种整型 ToString() 之后的形式,不能为浮点型,否则 int.Parse() 就会出现输入的字符串格式不正确的错误,int.TryParse() 也会返回 false,输出参数为 0 ,(int)只能是数字类型(例 float,int,uint等);
2)对于空值 NULL,从运行报错的角度讲,(int) 强制转换和 int.Parse() 都不能接受 NULL;Convert.ToInt32() 其实是在转换前先做了一个判断,参数如果为 NULL,则直接返回 0,否则就调用 int.Parse() 进行转换,int.TryParse() 其实是对 int.Parse() 做了一个异常处理,如果出现异常则返回 false,并且将输出参数返回 0;
3)针对于浮点型的取舍问题,浮点型只有 Convert.ToInt32() 和 (int) 能进行转换,但是也是进行取舍了的,Convert.ToInt32() 采取的取舍是进行四舍五入,而 (int) 则是截取浮点型的整数部分,忽略小数部分,例如 Convert.ToInt32(1.499d) 和 (int)1.499d 都返回 1,Convert.ToInt32(1.5d) 返回 2,而 (int)1.5d 还是返回 1;
4)关于溢出,将大的数据类型转换为小的数据类型时 Convert.ToInt32() 和 int.Parse() 都会报溢出错误,值对于 Int32 太大或太小,而 (int) 不报错,但是返回值为 -1。
如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,如果是整型字符串类型的,考虑用 int.Parse() 进行转换,如果不是这两种类型,再考虑用 Convert.ToInt32() 进行转换。
crespo
wq6***522@163.com
参考地址