四、C#类型转换

在C#中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。

C#中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称为强制类型转换)。

隐式类型转换

隐式转换是不需要编写代码来指定的转换,编译器会自动进行。

隐式转换是将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是C#默认的以安全方式进行的转换,不会导致数据丢失。

例如,从int到long,从float到double等。

从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个byte类型的变量赋值给int类型的变量,编译器会自动将byte类型转换为int类型,不需要显示转换。

cs 复制代码
byte b = 10;
int i = b; // 隐式转换,不需要显式转换

int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long

显式转换

显示类型转换,即强制类型转换,需要在代码明确指定。

显式转换是将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型符号进行显示转换,强制转换会造成数据丢失。

cs 复制代码
int i = 10;
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号



double doubleValue = 3.14;
int intValue = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分



int intValue = 42;
float floatValue = (float)intValue; // 强制从 int 到 float,数据可能损失精度


int intValue = 123;
string stringValue = intValue.ToString(); // 将 int 转换为字符串



using System;

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();
            
        }
    }
}

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 方法将字符串转换为整数:

cs 复制代码
string str = "123";
int number = Convert.ToInt32(str); // 转换成功,number为123

如果字符串不是有效的整数表示,Convert.ToInt32 将抛出 FormatException。

下面的实例把不同值的类型转换为字符串类型:

cs 复制代码
using System;

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();
        }
    }
}

在进行类型转换时需要注意以下几点:

隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型;

显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查;

对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查。

类型转换方法

C# 提供了多种类型转换方法,例如使用 Convert 类、Parse 方法和 TryParse 方法,这些方法可以帮助处理不同的数据类型之间的转换。

使用 Convert 类

Convert 类提供了一组静态方法,可以在各种基本数据类型之间进行转换。

cs 复制代码
string str = "123";
int num = Convert.ToInt32(str);

使用 Parse 方法

Parse 方法用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。

cs 复制代码
string str = "123.45";
double d = double.Parse(str);

使用 TryParse 方法

TryParse 方法类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。

cs 复制代码
string str = "123.45";
double d;
bool success = double.TryParse(str, out d);

if (success) {
    Console.WriteLine("转换成功: " + d);
} else {
    Console.WriteLine("转换失败");
}

在 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,返回布尔值表示是否成功
相关推荐
ZSYP-S10 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos13 分钟前
c++------------------函数
开发语言·c++
程序员_三木25 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊35 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama41 分钟前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全44 分钟前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言
羚羊角uou1 小时前
【C++】优先级队列以及仿函数
开发语言·c++