1. 为什么要进行类型转换?
C# 是个强类型语言。如果电脑有个“盒子”是专门装数字的,你硬要往里塞文本,这就像把叉子插进USB口一样。编译器绝对不会放过你!😡
不过,现实中我们经常要同时处理不同的数据类型。比如,你有个字符串,里面其实是个数字。这时候就需要类型转换(或者说类型变换)了。
来看个例子。假设你想存储用户数量:
int a = 1;
int b = "2";
int c = "三";
编译器立马就会说:“你把我当啥了?我可不会自动把字符串变成数字,得你自己来。你得手动把字符串转成数字。”
在C#里有好几种转换方式,每种都有自己的优缺点和常见坑点。
2. 把 int 转成 string
工作中经常需要把数字变成字符串:比如要显示在屏幕上、保存到文件、通过网络传输、跟文本拼接等等。C#里有好几种方法,不同场景下各有优势。
ToString() 方法
这是最基本、最常用的方式:
int number = 42;
string str = number.ToString(); // str == "42"
ToString() 会把数字按默认格式转成字符串。
字符串插值 ($"...")
现代写法,拼接变量很方便:
int number = 42;
string str = $"数字: {number}";
字符串插值会自动对插入的值调用 ToString()。
你可以组合多个变量,甚至指定格式:
int number = 42;
string str = $"{number:D5}"; // "00042" —— 五位数字,前面补零
和空字符串拼接
老方法,但也挺好用:
int number = 42;
string str = number + "";
这种写法简单场景下很快,但对看代码的人来说不太直观。
3. 隐式转换为字符串
前面说过,C#的开发者让所有变量、对象、表达式都能转成string类型。
而且,只要你把string类型和别的类型拼接,这个转换就会自动发生。比如:
int a = 5;
string name = "安雅" + a; // name 里是字符串 安雅5
int a = 5;
string city = a + "New York" + a; // city 里是字符串 5New York5
int number = 10;
string code = "Yo";
string message = "Hello! " + number + code; // message 里是字符串 Hello! 10Yo
这三个例子里,我们随便把 int 和 string 拼在一起,结果总是 string 类型。
举几个例子:
int a = 5;
string name = "1" + a; // name 里是字符串 15
int a = 5;
string city = a + "9" + a; // city 里是字符串 595
int number = 10;
string code = "10";
string message = "" + number + code; // message 里是字符串 1010
加法操作是从左往右算的,所以结果有时候会让你意外。比如:
int a = 5;
string name = a + a + "1" + a; // name 里是字符串 1015
执行顺序是: ((a + a) + "1") + a
4. 字符串转数字
在C#里,要把数字转成字符串,只要和空字符串拼一下就行了:
string str = "" + 数字;
那如果要把字符串转成数字呢?其实不是所有字符串都能转成数字。只有字符串全是数字的时候才行。为此,int 类型有个专门的方法 Parse()。
用法长这样:
int x = int.Parse("字符串")
这里 int x 是声明一个整型变量 x,字符串 是一个数字字符串(只包含数字的字符串)。
举几个例子:
string str = "123";
int number1 = int.Parse(str); // number1 里是数字 123;
int number2 = int.Parse("321"); // number2 里是数字 321
int number3 = int.Parse("321" + 0); // number3 里是数字 3210
int number4 = "321"; // 无法编译: 变量是int类型,值却是string类型
负数也可以这样转:int.Parse() 方法很智能。
GO TO FULL VERSION