C#(六)之数据类型转换的四种方法_camellias_的博客-程序员宅基地_在c#中,数据类型转换的方式有

技术标签: C#  显示转换  as  Convert  类型转换  后端  自学笔记  

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类进行类型转换。
在这里插入图片描述

长类型(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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qc23YkHk-1617329685025)(https://api.guanchao.site/ueditor/php/upload/image/20190409/1554794743264563.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
        }
    }
}

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39708228/article/details/92115306

智能推荐

INT 15h AX=E820h的用法_Geek-zhu的博客-程序员宅基地

简单来说,每执行一次这个指令将会将一个描述内存区域的数据结构保存到ES:DI,然后返回一个ebx,用于确定下一个能够探测的内存区域,当ebx=0时,表示当前已经时最后一个内存区域了。那么ebx的初始值呢,就是设置成ebx=0。其中可能遇到检查发生错误的情况,这个指令就会直接将CF设置为1。下图时输入时各个寄存器的作用:寄存器作用eax功能码,当输入e820h时能够探测内存ebx主要用于指向内存区域,第一次调用时ebx=0,被称为continuation valuees

CentOS7.5 通过wget下载文件到指定目录_weixin_30784501的博客-程序员宅基地

在Linux命令行下面下载文件,通过wget是比较普遍简单的,比如在CentOS7 里面也一样。我们先来看下自己的CentOS7 系统有没有安装wget:[[email protected] redis]# rpm -qa|grep wget如果安装了会提示当前安装的版本:wget-1.14-15.el7_4.1.x86_64没安装的话可以通过以下命令...

Linux 基于C的线程池实现_yangkunhenry的博客-程序员宅基地

首先这个线程池不是我写的,是在git上找到的星标最多的

Django运行方式及处理流程总结_大改427的博客-程序员宅基地

转自:http://www.kuqin.com/shuoit/20141109/343106.html 之前在网上看过一些介绍Django处理请求的流程和Django源码结构的文章,觉得了解一下这些内容对开发Django项目还是很有帮助的。所以,我按照自己的逻辑总结了一下Django项目的运行方式和对Request的基本处理流程。 一、Django的运行方式运行Django项目...

android retrofit_weixin_30723433的博客-程序员宅基地

感谢:图片来自https://www.cnblogs.com/baiqiantao/p/7494850.htmlHTTP:当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)Retrofit中有很多注解,这些注解总共分三类:H...

Java_final关键字,不可变类,缓存不可变类实例(缓存池技术)_menglei8625的博客-程序员宅基地

1. final变量:final修饰的变量一旦获得了初始值之后就不可被改变。final可以修饰成员变量,局部变量,形参。1.1 final成员变量:final修饰的类属性(static)可以在静态初始化块或声明时指定初始值;final修饰的实例属性可以在非静态初始化块,构造器或声明时指定初始值。class TestFinal { final int a = 1; //声明时指定初始值

随便推点

ifconfig 删除虚拟网络接口出现的问题_suyingshipp的博客-程序员宅基地_ifconfig 删除网卡

转自:http://blog.chinaunix.net/uid-24148050-id-3045244.html使用下面的命令启动多个IP别名/sbin/ifconfig eth0:1 1.42.9.162 netmask 255.255.255.224 /sbin/ifconfig eth0:2 1.42.9.163 netmask 255.255.255.224 /sbin/if

Windows 7 Beta Customer Preview Program to End_weixin_33774308的博客-程序员宅基地

Windows 7 Beta Customer Preview Program to End· Starting January 27th, the Windows 7 page will be updated with a warning that time is running out on downloading the Windows ...

关于easyui的tree的异步加载处理_chirendan6562的博客-程序员宅基地

1、前端jsp <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><script type="text/javascript">...

link关系型API:Table API与SQL_zb313982521的博客-程序员宅基地

本篇文章主要介绍flink的关系型API,整个文章主要分为下面几个部分来介绍:什么是flink关系型API flink关系型API的各版本演进 flink关系型API执行原理 flink关系型API目前适用场景 Table & SQL API介绍 Table & SQL API举例 动态表 总结一、什么是flink关系型API当我们在使用flink做流式和批...

推荐文章

热门文章

相关标签