C#类型转换

C#类型转换

隐式类型转换

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:

隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。

 int inum = 100;
 long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
 Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1

显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。【注:使用as可以进行显式转换】

在这里插入图片描述
在这里插入图片描述

C# 常见显式转换方法总结对比

Convert.ToInt32() 、int.TryParse() 和 int.Parse() 、(int)的区别

1)对于转换对象

Convert.ToInt32() 可以为多种类型(除数字类型外 bool,string,DateTime 等)

int.TryParse() 和 int.Parse() 只能是整型字符串类型(即各种整型 ToString() 之后的形式,不能为浮点型,否则 int.Parse() 就会出现输入的字符串格式不正确的错误,int.TryParse() 也会返回 false,输出参数为 0

(int)只能是数字类型(例 float,int,uint等)

2)对于空值 NULL

从运行报错的角度讲,(int) 强制转换和 int.Parse() 都不能接受 NULL【会报异常】

Convert.ToInt32() 其实是在转换前先做了一个判断,参数如果为 NULL,则直接返回 0【不会报异常】,否则就调用 int.Parse() 进行转换

int.TryParse() 其实是对 int.Parse() 做了一个异常处理,如果出现异常则返回 false,并且将输出参数返回 0

3)针对于浮点型的取舍问题

浮点型只有 Convert.ToInt32() 和 (int) 能进行转换,但是也是进行取舍了的,
Convert.ToInt32() 采取的取舍是进行四舍五入,
而 (int) 则是截取浮点型的整数部分,忽略小数部分,
例如 :Convert.ToInt32(1.499d) 和 (int)1.499d 都返回 1,Convert.ToInt32(1.5d) 返回 2,而 (int)1.5d 还是返回 1;

4)关于溢出

将大的数据类型转换为小的数据类型时 ,Convert.ToInt32() 和 int.Parse() 都会报溢出错误,值对于 Int32 太大,而 (int) 不报错,但是返回值为 -1。

如此可见,我们在进行数据转换前选择转换方法要谨慎!

如果是数字类型可以考虑直接用(int)强制转换,
如果是整型字符串类型的,考虑用 int.Parse() 进行转换,
如果不是这两种类型,再考虑用 Convert.ToInt32() 进行转换。

程序代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Test
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("Size of int: {0}", sizeof(Char));
            //Console.ReadLine();

            //示例1:
            string locstr = 4567.ToString();
            //方法一:用Convert
            int i = Convert.ToInt16(locstr);
            //方法二:用Parse
            int ii = int.Parse(locstr);
            Console.WriteLine(locstr);
            Console.WriteLine(i);
            Console.WriteLine(ii);
            Console.WriteLine();
            

            //示例2:
            //该方式也是将数字内容的字符串转换为int类型,
            //但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,
            //如果转换成功则输出相应的值,转换失败则输出0。 
            string s1 = "abcd";
            string s2 = "1234";
            int a, b;
            bool bo1 = int.TryParse(s1, out a);
            Console.WriteLine(s1 + " " + bo1 + " " + a);
            bool bo2 = int.TryParse(s2, out b);
            Console.WriteLine(s2 + " " + bo2 + " " + b);
            Console.WriteLine();

            //示例3:
            //C# 中对 double 类型的数据取整,可以使用 convert.toint32() 方法,也可使用 int 强制转换为整数,
            //使用 int 时并不存在四舍五入的情况,而是直接将后面的小数位数丢掉。比如:
            double c = 1.35;
            double d = 1.65;
            int c1 = Convert.ToInt32(c);
            int c2 = (int)(c);
            int d1 = Convert.ToInt32(d);
            int d2 = (int)(d);
            Console.WriteLine("{0}使用convert方法转化的结果为:{1}", c, c1); //输出1
            Console.WriteLine("{0}使用int强制转换的结果为:{1}", c, c2);   //输出1
            Console.WriteLine("{0}使用convert方法转化的结果为:{1}", d, d1);   //输出2
            Console.WriteLine("{0}使用int强制转换的结果为:{1}", d, d2);   //输出1
            
            Console.ReadLine();
        }
    }
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中,AB测试(也称为分组测试或随机化对照实验)是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组(通常是A组和B组),对比不同版本的产品或策略对关键…

CMake+vcpkg+VS2022配置github上的cmake开源项目外部库

我们以采用 GitHub 上的开源库 cuda-bundle-adjustment 为例,其不能直接用vcpkg进行安装,只能通过cmake编译后链接到VS2022。 将 cuda-bundle-adjustment 库通过 CMake 编译链接到 Visual Studio 2022 步骤操作: 克隆存储库:使用…

【实验01 扩展实验】C#桌面项目:简易计算器

【实验要求】 (1)新建一个C#桌面项目Calc,实现简易计算器功能,界面如图1所示。 (2)计算方式:通过点击对应的按钮,输入第1个数(可以是整数或实数)&#xff0c…

呵护地球不止一小时 食品行业如何为地球减负

“关爱地球,熄灯一小时”。作为全世界规模最大的应对气候变化行动之一,“地球一小时”自2007年进入中国以来,一直广受关注,社会各界竞相支持并参与。2024年,该活动以“为地球献出一小时”为主题,呼吁社会各界以实际行动为地球减负。 作为与大众日常生活息息相关的食品企业该如何…

【C++】堆区空间的申请和释放--- 2024.3.19

目录 C和C的区别(申请堆区空间)C中的new和delete结束语 C和C的区别(申请堆区空间) 在c语言中,在遇到需要申请一块堆区空间时,我们往往会使用malloc申请,使用free进行释放,但是为什么…

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码:a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…

Trait与生命周期

原文链接:(*∇`*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

【C++】内存管理和模板基础(new、delete、类及函数模板)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:http://t.csdnimg.cn/eCa5z 目录 内存分布 C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator d…

Cesium:绘制一个 3DTiles 对象的外包盒顶点

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制一个 3DTiles 对象的外包盒顶点。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题,相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题,导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因,只是看到一些连锁反应带来的结果…… 影响因素…

qmldir的理解

目录结构: 文件内容 qmldir中: module QtLocaion plugin declarative_location classname QtLocationDeclarativeModule typeinfo plugins.qmltypes 其中: QtLocaion必须与qmldir所在的文件夹名字一样 plugin 后面的declarative_location 为…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行:…

项目中遇到的sql问题记录

有一张表,表结构及数据如下: INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) VALUES (approve001, 2021-02-18 00:00:00, tableA, 2024-03-18); INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) …

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**: cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3:显示前一个月、当前月和下一个月的日历。-y:显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

Easy Connect下载(Windows版)

文章目录 1. 下载连接2. 安装 1. 下载连接 百度网盘链接:https://pan.baidu.com/s/13r4wxz-Df3S_IMruZIDucw  提取码:mmcc 2. 安装 1. 下载安装包解压后,双击.exe文件就可以安装软件。 2. 耐心等待Easy Connect安装…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化,则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件,Android Studio 和 Android 虚拟设备&#xff…

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下: 1、gitlab-runner由docker镜像部署; 2、gitlab部署与内网&#xff0…

Linux的背景介绍

1.Linux的发展史 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹&#xff08…

Android studio开发中Virtual Device模拟器的设置和屏幕错位等问题

Android SDK开发中Virtual Device模拟器的设置和使用 本文介绍android studio2023 3.1.13版本中模拟器的设置和在cordova开发中的运行方法 对于老版android studioAVD模拟器的使用,参见:Android SDK手机应用开发中第三方模拟器、真机运行方法以及AVD模拟…

安卓RecyclerView简单用法

废话不多说上代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schem…