C#(六)之数据类型转换的四种方法

简介: 转换方式有:数据类型的隐式转换,相对安全,不会导致数据丢失;显式转换强制类型转换,而且强制转换会造成数据丢失;使用Convert类进行类型转换;as运算符。

QQ图片20220426103503.jpg

1:数据类型的隐式转换,相对安全,不会导致数据丢失


无关键字与变量类型修饰的转换称作隐式转换。(不是所有的隐式转换都是可以的)

实例:


short a = 1212;
int b;
b = a; // 隐式转换
//Console.WriteLine(b);
int aa = 12;
short bb;
bb = aa;  // 这样的隐式转换会报错,因为int包含short。
Console.WriteLine(bb);


任何整数类型,都可以隐式的转化为任何浮点数类型。


int aaa = 12;
double bbb = 10.02;
bbb = aaa;  // 整形隐式转换成浮点型
Console.WriteLine(aaa);


2:数据类型的显式转换强制类型转换,而且强制转换会造成数据丢失。


Int类型是可以转换为short类型的,只要其值在short取值范围内。一定要估计好数据类型的取值范围。


// int az = 12345;   //输出值为123456
int az = 123456;     //输出值为-7616
short h;
h = (short)az;
Console.WriteLine(h);


显示转换需要注意精度问题(不是很安全)


double pai = 3.14;
int asd;
asd = (int)pai; // 3,不是四舍五入,是直接截取
Console.WriteLine(asd);


使用check关键字:提示运行错误


int az = 123456;    
short h;
h = checked((short)az);
Console.WriteLine(h);


输出结果:


未经处理的异常:  System.OverflowException: 算术运算导致溢出。


3:使用Convert类进行类型转换。


QQ图片20220426103506.png


长类型(int、long)转换成短类型(byte、short)需要考虑容量的问题 转换为int型数据后进行了四舍五入的计算。 用convert类转换时注意数据表达方式的有效性,并不是任意类型之间都可以转换。比如string类型转int类型,string只能是数字。


// 字符串转换双精度浮点
string p = "3.14";
double pp = Convert.ToDouble(p);         
int d = 10;
double f = Convert.ToDouble(d);
Console.WriteLine(f); //10
int a = 1234;
string asd = Convert.ToString(a);
Console.WriteLine(asd);  // 1234
Console.WriteLine(asd.GetType()); // System.string
char qwe = Convert.ToChar(a);
Console.WriteLine(qwe);  // ?  字符只能是一位
Console.WriteLine(qwe.GetType());  // System.Char
string dc = "4125";
int ws = Convert.ToInt32(dc);
Console.WriteLine(ws);  // 4125
Console.WriteLine(ws.GetType());  // System.Int32
string dates = "2019-05-31"; // 必须是字符串才能转换成datetime
DateTime qa = Convert.ToDateTime(dates);
Console.WriteLine(qa);  // 2019/5/31 0:00:00
Console.WriteLine(qa.GetType()); // System.DateTime
string zxc = "5.32";
double po = Convert.ToDouble(zxc);
Console.WriteLine(po);  // 5.32
Console.WriteLine(po.GetType());// System.Double
float rf = Convert.ToSingle(zxc);
Console.WriteLine(rf);  // 5.32
Console.WriteLine(rf.GetType());// System.single


QQ图片20220426103509.png


4:as运算符


as 运算符必须与引用类型或者可以为null类型的变量一起使用,否则会报编译错误


使用as运算符进行类型转换效率相对高一些。


示例:


int aaaa = 10;
object strs = aaaa as object;


下面两种情况不能使用as运算符进行类型转换。


1、不用在类型之间进行类型转化,即如下编写就会出现编译错误。


NewType newValue = new NewType();
NewTYpe1 newValue = newValue as NewTYpe1;


这个可以直接进行显示转换


NewType newValue = new NewType();
NewTYpe1 newValue = (newValue)NewTYpe1;


2、不能应用在值类型数据,即不能如下写(也会出现编译错误)


Object obj1 = 11;
int nValue = obj1 as int;


这个首先需要使用 is 运算符进行判断 再进行显示转换


Object obj1 = 11;
if(objTest is int )
{
    int nValue = (int)obj1;
}


5:装箱和拆箱(比较慢)


装箱   是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。(隐式转换)


拆箱   是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。(显示转换)


int i = 13;
 object ob = i; // 这是装箱
int i = 13;
object ob = i;
int j = (int)ob;  // 这是拆箱


在C#中提供的很好的类型转换方式总结为: Object => 已知引用类型——使用as操作符完成; Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换; 已知引用类型之间转换——首先需要相应类型提供转换函数,再用类型强转换方式进行转换; 已知值类型之间转换——最好使用系统提供的Conver类所涉及的静态方法。


测试完整代码:我这里使用的是控制台应用


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gc
{
    class Program
    {
        /* C#主要的运行函数,就是main函数 */
        static void Main(string[] args)
        {
            short a = 1212;
            int b;
            b = a; // 隐式转换
            //Console.WriteLine(b);
            int aa = 12;
            short bb;
            //bb = aa;  // 这样的隐式转换会报错,因为int包含short。
            //Console.WriteLine(bb);
            int aaa = 12;
            double bbb = 10.02;
            bbb = aaa;  // 整形隐式转换成浮点型
            //Console.WriteLine(aaa);
            // int az = 12345;   //输出值为123456
            int az = 123456;     //输出值为-7616
            short h;
            //h = checked((short)az);
            // Console.WriteLine(h);
            double pai = 3.14;
            int asd;
            asd = (int)pai; // 3,不是四舍五入,是直接截取
            //Console.WriteLine(asd);
            // 字符串转换双精度浮点
            string p = "3.14";
            double pp = Convert.ToDouble(p);
            int d = 10;
                        double f = Convert.ToDouble(d);
                        Console.WriteLine(f); //10
            // 使用Convert类转换的一些实例
            int a = 1234;
            string asd = Convert.ToString(a);
            Console.WriteLine(asd);  // 1234
            Console.WriteLine(asd.GetType()); // System.string
            char qwe = Convert.ToChar(a);
            Console.WriteLine(qwe);  // ?  字符只能是一位
            Console.WriteLine(qwe.GetType());  // System.Char
            string dc = "4125";
            int ws = Convert.ToInt32(dc);
            Console.WriteLine(ws);  // 4125
            Console.WriteLine(ws.GetType());  // System.Int32
            string dates = "2019-05-31"; // 必须是字符串才能转换成datetime
            DateTime qa = Convert.ToDateTime(dates);
            Console.WriteLine(qa);  // 2019/5/31 0:00:00
            Console.WriteLine(qa.GetType()); // System.DateTime
            string zxc = "5.32";
            double po = Convert.ToDouble(zxc);
            Console.WriteLine(po);  // 5.32
            Console.WriteLine(po.GetType());// System.Double
            float rf = Convert.ToSingle(zxc);
            Console.WriteLine(rf);  // 5.32
            Console.WriteLine(rf.GetType());// System.single
        }
    }
}


目录
相关文章
|
存储 C# 索引
C# 一分钟浅谈:变量与数据类型简介
【9月更文挑战第1天】在 C# 编程中,了解变量与数据类型至关重要。本文详细介绍了 C# 中的值类型(如整数、浮点数、布尔值等)和引用类型(如类、接口、数组、字符串)。通过示例代码展示了变量的声明与使用方法,并针对数据类型转换错误、变量未初始化及数值溢出等常见问题提供了解决方案。正确选择数据类型不仅能提升程序性能,还可避免潜在错误,有助于编写高质量代码。
214 48
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
946 0
|
11月前
|
开发框架 .NET API
以C#一分钟浅谈:GraphQL 数据类型与查询
本文从C#开发者的角度介绍了GraphQL的基本概念、核心组件及其实现方法。GraphQL由Facebook开发,允许客户端精确请求所需数据,提高应用性能。文章详细讲解了如何在C#中使用`GraphQL.NET`库创建Schema、配置ASP.NET Core,并讨论了GraphQL的数据类型及常见问题与解决方案。通过本文,C#开发者可以更好地理解并应用GraphQL,构建高效、灵活的API。
235 64
|
12月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
218 65
|
10月前
|
开发框架 .NET 测试技术
C# 一分钟浅谈:GraphQL 数据类型与查询
本文介绍了GraphQL的基本概念、数据类型及查询方法,重点从C#角度探讨了GraphQL的应用。通过Hot Chocolate库的实例,展示了如何在ASP.NET Core中实现GraphQL API,包括安装、定义Schema、配置及运行项目。文中还讨论了常见问题与解决方案,旨在帮助开发者更好地理解和使用GraphQL。
135 2
|
11月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
372 2
|
11月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
465 3
|
12月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
302 1
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) => expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
176 8
|
12月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
120 0