C#教程[3] 数据类型转换


本文最先发布于个人博客,去个人博客观看效果更佳

C# 是一门强类型语言,对类型的要求很严格,类型转换的方式有两种:隐式类型转换显式类型转换

隐式类型转换

int a = 5;
double b = 1.5;
double c = a + b;
System.Console.WriteLine(c);

像这样,并没有对源代码进行任何特殊处理,而是由编译器自动进行了从int类型到double类型的隐式转换。

但是很多类型之间不可以进行隐式类型转换,可以看下面的例子。

double a = 1.5;
int b = a;
System.Console.WriteLine(b);

在作者的电脑上编译时会有这样的报错:

错误 CS0266 无法将类型“double”隐式转换为“int”

因此,我们需要用显式类型转换改正它。

显式类型转换

上面的例子的第二行应改为这样:

int b = (int)a;

语法就是在要转换的变量前加一组小括号,里面写要转换成的类型名。所有的隐式类型转换都可以写成显式。

但是这样写输出的结果却是1而非想象中的四舍五入2

用显式类型转换会丢失数据的精度,这也是为什么编译器不会自动进行显式类型转换。显式类型转换又叫强制类型转换。

而且显式类型转换也并非所有类型之间都能转的,例如下面这么写也是错误的:

double a = (double)"5.5";

注意:在许多其他编程语言里,int可以隐式转换为bool,但是C# 中无论是隐式还是显式都会报错,要使用后面提到的Convert.ToBoolean()

为了解决上述的问题,我们将介绍使用方法进行类型转换。

使用方法进行类型转换

使用ToString()方法

所有的类型都可以使用ToString()方法,如下:

int a = 5;
string b = a.ToString();

使用Convert.ToInt32()方法

Convert为类名,ToInt32()为其中的方法名。Convert类提供了许多转换的方法,例如:ToChar()ToDouble()ToBoolean()

例如:

int a = Convert.ToInt32("5.0");

使用int.Parse()方法

Parse()方法用来将字符串转换为其他的类型

注意:Parse()方法的参数只能是字符串

使用时 类型名.Parse(需要转换的变量); 即可

例如:

string a = "5";
int b = int.Parse(a);

虽然例子中用的是int类型,但实际上所有数字类型都有类似的方法。

但是将字符串"apple"转换为int时还是会报错导致程序无法继续运行,且我们也并不真的希望他把apple转为int类型,这时我们可以使用TryParse()方法。

使用 int.TryParse()等方法

微软官方教程中的说明如下:

TryParse() 方法可同时执行多项操作:

  1. 它会尝试将字符串分析成给定的数字数据类型。

  2. 如果成功,它会将转换后的值存储在 out 参数中。

  3. 它会返回布尔值来指示操作是否成功。

对于所有数字数据类型,均可使用类似的 TryParse() 方法。

例如:

double result;
string str = "5.5";
bool a = double.TryParse(str, out result); // result 即为说明中第2条的 "out参数" 
System.Console.WriteLine($"a = {a}\nresult = {result}\n");

此时,输出结果应为:

a = True
result = 5.5

例题:(来自微软官方文档 链接)

题意:

已知一个字符串数组values

string[] values = { "12.3", "45", "ABC", "11", "DEF" };

循环访问字符串数组中的每个值, 对于每个值满足以下规则:

规则 1:如果值是字母,则连接它以形成消息

规则 2:如果值是数字,则将其加到总计值

样例输出:

Message: ABCDEF
Total: 68.3

示例代码:

官方:

using System;

string[] values = { "12.3", "45", "ABC", "11", "DEF" };

decimal total = 0m;
string message = "";

foreach (var value in values)
{
    decimal number;
    if (decimal.TryParse(value, out number))
    {
        total += number;
    } else
    {
        message += value;
    }
}

Console.WriteLine($"Message: {message}");
Console.WriteLine($"Total: {total}");

作者的版本:

using System;

string[] values = { "12.3", "45", "ABC", "11", "DEF" };

decimal total = 0.0m;
string message = "";

foreach (string v in values)
{
    if (decimal.TryParse(v, out decimal curr)) total += curr; // 这样写curr变量只会在if语句的范围内生效
    else message += v; 
}

Console.WriteLine($"Messagae: {message}\nTotal: {total}\n");

其他注意事项:

试图将字符串"5.5"转换成int类型时,下面两种方法都是错误的:

int a = Convert.ToInt32("5.5");
int a = int.Parse("5.5");

正确的做法应该是先把字符串"5.5"先转换成double类型,再转换成int类型,比如下面两种方法:

int a = (int)Convert.ToDouble("5.5");
int a = (int)Double.Parse("5.5");
C