C# 类型转换
- 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
1.隐式转换和显式转换:
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 66.70;
int i;
// 显式类型转换(强制转换) double 为 int
i = (int)d;
// 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
int inum = 100;
long lnum = inum;
Console.WriteLine(i);
Console.WriteLine(lnum);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
66
100
2.下面的实例把不同值的类型转换为字符串类型:
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
int i = 77;
float f = 62.005f;
double d = 23456.7652;
bool b = true;
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
77
62.005
23456.7652
True
- 类型之间的转换 - Convert.ToInt32() 和 int.Parse();int.TryParse()
1). int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。
如果字符串为空,则抛出ArgumentNullException异常;
如果字符串内容不是数字,则抛出FormatException异常;
如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;
2). int.TryParse与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。
int.TryParse(string s,out int i)
第一个参数为要转化的值,第二个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值
该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。
class test
{
static void Main(string[] args)
{
string s1="abcd";
string s2="1234";
int a,b;
bool bo1=int.TryParse(s1,out a);
Console.WriteLine(s1+" "+bo1+" "+a);
bool bo2=int.TryParse(s2,out b);
Console.WriteLine(s2+" "+bo2+" "+b);
}
}
结果输出:
abcd False 0
1234 True 1234
3). Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数;
- string 转 int 与抛异常
string 字符串类型和 int 也是可以转换的。下面代码给出错误的转换方法。
string a = "123"; // 将a设置为字符串“123”
int x = (int) a; // 转换
VS 在编译时就会报错, 那么,string 该怎么转换成 int 类型, 我们需要用到 int.Parse(), 代码:
string a = "123"; // 将a设置为字符串“123”
int x = int.Parse(a); // 转换
如果仅仅是这样,是没有问题的,但是,我们下面再来做一个实例。
用户输入一个数字,而电脑将计算出这个数字加上1以后的答案,并且显示出来。
用户输入的东西,即 Console.ReadLine() ,一定是以字符串形式表现的。
于是,运用之前的方法,我们可以写出以下的代码:
class test
{
static void Main(string[] args)
{
Console.WriteLine("输入数字,将计算出它加1的答案");
int a = int.Parse(Console.ReadLine()); //转换用户输入的数字
Console.WriteLine("答案是{0}",++a); //++a 即 a+1 后的那个数
Console.ReadKey();
}
}
当程序运行时,会出现:
输入数字,将计算出它加1的答案
5
答案是 6
但是!!! 如果用户输入并非数字的其他字符,如汉字,会发生什么情况?
此时,用户输入 王 ,程序将无法继续运行下去,因为int类型只能存整数,不能存字符。
这时,程序就会抛出异常。
如果用 VS 编,你还会看到异常类型:FormatException。
所以,为了保险,可以用try、catch来解决此问题。核心代码为:
try
{
}
catch (Exception)
{
}
try 在英语中就是尝试的意思。在这段代码中,try{} 部分,顾名思义,也就是去尝试进行下面的代码。catch{} 部分,则是检测异常。这样,在出现异常时,catch 就能捕获到异常,从而程序并不会停止。
则这段程序,完整的代码应该为:
using System;
class 测试
{
static void Main(string[] args)
{
try
{
Console.WriteLine("输入数字,将计算出它加1的答案");
int a = int.Parse(Console.ReadLine()); //有可能会抛出异常
Console.WriteLine("答案是{0}",++a); //如果没有异常,程序才会进入这一步
}
catch (Exception)
{
Console.WriteLine("无法转换"); //如果捕获到异常,就说“无法转换”
}
Console.ReadKey();
}
}
这样,如果我输入了 '王' ,程序结果为:
无法转换