【C#学习笔记】类型转换

文章目录
- 类型转换
- 字符转数字
- GetNumericValue
- Convert.ToInt32
- 隐式转换计算
- 字符串转数字
- Parse 或 TryParse 方法
- 字节数组转整数
- as,is强制类型转换
- is
- as
- 用户定义的转换
类型转换
我们简单地将值类型分为5种:整数型,浮点型,布尔型,字符型,再加上一个本属于引用类型的字符串。
由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或无法分配另一种类型的值,除非该类型可以隐式转换为变量的类型。
-
隐式转换:由于这种转换始终会成功且不会导致数据丢失,因此无需使用任何特殊语法。 示例包括从较小整数类型到较大整数类型的转换以及从派生类到基类的转换。
-
显式转换(强制转换) :必须使用强制转换表达式,才能执行显式转换。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。 典型的示例包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换。
上述2种转换就不过多赘述,隐式转换和显式转换都是十分基础的
-
用户定义的转换:用户定义的转换是使用特殊方法执行,这些方法可定义为在没有基类和派生类关系的自定义类型之间启用显式转换和隐式转换。 有关详细信息,请参阅用户定义转换运算符。
-
使用帮助程序类进行转换:若要在非兼容类型(如整数和 System.DateTime 对象,或十六进制字符串和字节数组)之间转换,可使用 System.BitConverter 类、System.Convert 类和内置数值类型的 Parse 方法(如 Int32.Parse)。 有关详细信息,请参见如何将字节数组转换为 int、如何将字符串转换为数字和如何在十六进制字符串与数值类型之间转换。
字符转数字
GetNumericValue
GetNumericValue是char类型提供的方法,用于将字符转换为double值的数字,失败则返回-1.0
令我不解的是,字符类型只能保存0~9之间的数字,不可能保存浮点数,不知为何返回值是double类型的。
public int a = 123;
char tmp;
tmp = a.ToString()[0];
char.GetNumericValue(tmp);// 使用char提供的GetNumericValue方法可以将char转为double的1
Convert.ToInt32
Convert类型的转换存在大量重载,基本可以应对所有转换情况
public int a = 123;
char tmp;
tmp = a.ToString()[0];
int b =Convert.ToInt32(tmp); // 使用ToInt32会将字符1转为ASCII码49
隐式转换计算
int a = 123;
char tmp;
tmp = a.ToString()[0];
int t = tmp - '0'; // 使用char类型进行计算,最后的结果类型是整数型,输出结果是ASCII码相减
// 49 - 48 = 1
字符串转数字
字符串转数字是一种比较万能的方法,因为object提供了ToString方法,能够让任何值类型都转化为字符串。
Parse 或 TryParse 方法
Parse 和 TryParse 方法会忽略字符串开头和末尾的空格,但所有其他字符都必须是组成合适数值类型(int、long、ulong、float、decimal 等)的字符。
char tmp = '1';
int a = Int32.Parse(" -105 "); // a = -105,无视空格
a = Int32.Parse(tmp.ToString()); // a = 1
bool b = Int32.TryParse("200", out a); // a = 200,方法本身返回布尔值,b = true
错误用法:
Int32.Parse(" -1.05 "); //浮点型不能用整型的Parse方法,应该为float.Parse或其他浮点型的Parse方法
Int32.Parse(" 1 05 "); // 数字之间不能有空格
Int32.Parse(" 10e1 "); // 不接受科学计数法,
字节数组转整数
由于一般的整数类型Int的类型是System.Int32。而一个byte代表8位,所以一个Int32=4个字节,因此如果要字节转整数,一般需要四个四个地转变。
使用BitConverter类来操作字节数组
byte[] bytes = { 0, 0, 0, 25 };
// 此处是根据操作系统来决定字符顺序的
// 不同计算机的字节体系不同,可能高八位,可能低八位
if (BitConverter.IsLittleEndian)Array.Reverse(bytes);int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25
as,is强制类型转换
is
is 运算符检查表达式结果的运行时类型是否与给定类型兼容。 is 运算符还会对照某个模式测试表达式结果。
具有类型测试 is 运算符的表达式具有以下形式
E is T
E is not T
其中E是返回一个值的表达式,T是类型或类型参数的名称。 E 不得为匿名方法或 Lambda 表达式。
简单的来说,is判断true对应四种判断
- 当
E为T类型时 - 当为
T的派生类,子类,继承类(包括类和接口)时。 - 当
E为T的可为空类型T?,且E不为空时 - 当
E到T的转换涉及装箱拆箱时
让我们分别看看这四种对应的判断:
当E为T 类型时:
int a = 0;
if (a is int) // true
{Debug.Log(a);
}
if (a is long) // false
{Debug.Log(a);
}
当为T的派生类,子类,继承类(包括类和接口)时:
class Parent
{}
interface IDonothing
{}
class child : Parent, IDonothing
{}
void Start()
{child c = new child();int a = 0;if (c is Parent) // true{Debug.Log(0);}if (c is IDonothing) // true{Debug.Log(1);}
}
当E为T的可为空类型T?,且E不为空时
int? a = null;
if (a is int) // a为int?但为空,false
{Debug.Log(1);
}
if (a is int?) // a为int?但为空,false
{Debug.Log(2);
}
int b = 1;
if (b is int) // b为int,true
{Debug.Log(3);
}
if (b is int?) // b为int,true
{Debug.Log(4);
}
a = 1;
if (a is int) // a为int?且不为空,true
{Debug.Log(5);
}
if (a is int?) // a为int?且不为空,true
{Debug.Log(6);
}
当E到T时涉及装箱拆箱时
object O;
int a = 1;
O = a;
if (O is int) // true
{Debug.Log(1);
}
if (O is int?) // true
{Debug.Log(2);
}
if (a is object) // true,毕竟object是所有类的父类,此时符合第二条E为T的派生类
{Debug.Log(3);
}
在检测类型时,is类型会对E类型进行T类型转换来判断是否为T类型,但不对E的本身的类型造成影响。但is类型不会考虑用户自定义的类型转换。
as
as运算符将表达式结果显式转换为给定的引用或可以为null值的类型。 如果无法进行转换,则as运算符返回null。 与强制转换表达式 不同,as运算符永远不会引发异常。
E as T
使用as运算符,与下述三目运算符是一样的:
E is T ? (T)(E) : (T)null
使用as进行转换,其中类型T必须是可为null值的类型
as 运算符仅考虑引用类型、可以为 null、装箱和取消装箱转换。 不能使用 as运算符执行用户定义的转换。 为此,请使用强制转换表达式。
object o = new object() as string;
o = "1";
Debug.Log(o.GetType()); // string类型
用户定义的转换
implicit operator 或 explicit operator 关键字分别用于定义隐式转换或显式转换。 定义转换的类型必须是该转换的源类型或目标类型。 可用两种类型中的任何一种类型来定义两种用户定义类型之间的转换。
using System;
public readonly struct Digit
{private readonly byte digit;public Digit(byte digit){if (digit > 9){throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");}this.digit = digit;}public static implicit operator byte(Digit d) => d.digit;public static explicit operator Digit(byte b) => new Digit(b);public override string ToString() => $"{digit}";
}public static class UserDefinedConversions
{public static void Main(){var d = new Digit(7);byte number = d;Console.WriteLine(number); // output: 7Digit digit = (Digit)number;Console.WriteLine(digit); // output: 7}
}
使用自定义类型可以定义隐式转换和显示转换,但是要注意类型匹配。
相关文章:
【C#学习笔记】类型转换
文章目录 类型转换字符转数字GetNumericValueConvert.ToInt32隐式转换计算 字符串转数字Parse 或 TryParse 方法 字节数组转整数 as,is强制类型转换isas 用户定义的转换 类型转换 我们简单地将值类型分为5种:整数型,浮点型,布尔型…...
SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统
文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》:让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业(餐厅、饭店&#x…...
笙默考试管理系统-MyExamTest--calculagraph
笙默考试管理系统-MyExamTest--calculagra(1) 目录 一、 笙默考试管理系统-MyExamTest--calculagra 二、 笙默考试管理系统-MyExamTest--calculagra 三、 笙默考试管理系统-MyExamTest--calculagra 四、 笙默考试管理系统-MyExamTest--calculagra …...
Mysql面试突击班索引,事务与锁
Mysql面试突击班索引,事务与锁 1.为什么Mysql要使用B树做为索引而不用B树 B树能显著减少IO次数,提高效率B树的查询效率更加稳定,因为数据放在叶子节点B树能提高范围查询的效率,因为叶子节点指向下一个叶子节点B树采取顺序读 2.…...
数据结构——AVL树
文章目录 一.AVL树的定义二.AVL树的插入三.插入后更新平衡因子四.AVL树的旋转1.左单旋2.右单旋3.先左单旋再右单旋4.先右单旋再左单旋 五.AVL树的性能分析六.检查是否满足AVL树七.源码 一.AVL树的定义 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉…...
AI写作宝有哪些,分享两种AI写作工具
AI写作宝是一种基于人工智能技术的写作辅助工具。它可以根据用户输入的关键词和主题快速生成文章。AI写作宝可以为用户节省大量的时间和精力,帮助用户快速生成高质量的文章。今天就为大家推荐两款AI写作宝: 一、AI创作家 AI创作家是一款基于人工智能技…...
【uniapp 控制页面滑动速度】
可以使用 uni-app 提供的 onTouchMove 事件来控制页面滑动速度。 可以在 onTouchMove 事件方法中使用 event.deltaY 计算页面滑动的速度,然后根据需要来调整速度值,最后通过 event.preventDefault() 阻止默认的滑动行为,从而实现控制页面滑动…...
7-24 整数的分类处理 (20 分)
7-24 整数的分类处理 (20 分) 给定 N 个正整数,要求你从中得到下列三种计算结果: A1 能被 3 整除的最大整数 A2 存在整数 K 使之可以表示为 3K1 的整数的个数 A3 存在整数 K 使之可以表示为 3K2 的所有整数的平均值(精确到小数…...
MYSQL事务同时修改单条记录
疑问:Mysql多事务默认情况下,同时修改同一条记录运行修改吗?是否要手动加上for update行锁。 猜想:MySQL 会自动对涉及的数据行加上写锁(排他锁),以确保数据的一致性和隔离性。这是在默认的事务…...
安装skywalking并集成到微服务项目
文章目录 一、前言二、介绍1. 架构 三、安装skywalking服务端四、启动skywalking服务端五、微服务项目开发注册中心网关服务商品服务订单服务支付服务测试 六、下载java客户端七、微服务集成skywalking客户端1. idea启动2. 命令行启动3. 集成效果4. 服务实例5. 修改服务实例名称…...
一支笔,一双手,一道力扣(Leetcode)做一宿
文章目录 一、分享自己相关的经历二、分析可能存在的问题三、根据问题进行分解或建立思维导图四、分享好用的刷题网站并进行介绍 一、分享自己相关的经历 我是一名计算机专业的学生,之前在学习算法和数据结构时,对于简单题目还算能够顺利地刷过去。但是…...
Kubernetes(K8s)从入门到精通系列之九:使用kubeadm工具快速安装K8s集群
Kubernetes K8s从入门到精通系列之九:使用kubeadm工具快速安装K8s集群 一、安装kubeadm二、修改kubeadm的默认配置三、下载K8s相关镜像四、运行kubeadm imit命令安装Master节点五、将新的Node加入集群六、安装CNI网络插件七、验证K8s集群是否工作正常八、搭建高可用K8s集群详细…...
RabbitMQ 教程 | 第11章 RabbitMQ 扩展
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
一分钟完成centos7安装docker
action: 1、下载安装包2、安装docker 1、背景 使用CentOS / Redhat 7 版本的应该偏多。但是,Docker CE在系统中安装的时候,往往会出现一堆依赖包的报错,解决依赖包需要耗费不短的时间。 经验证,目前已找到兼容能力强的版本&am…...
NativePHP:使用PHP构建跨平台桌面应用的新框架
NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用。NativePHP具有一系列易于使用的类,一套用于构建和打包应用程序的工具以及一个静态跨平台PHP运行时。 官网地址:https://nativephp.comNati…...
删除这4个文件夹,流畅使用手机无忧
在现代社会中,手机已经成为我们生活中不可或缺的一部分。然而,随着使用时间的增长,我们可能会遇到手机卡顿和内存不足的问题,让我们感到十分困扰。手机卡顿不仅影响使用体验,还可能导致应用程序运行缓慢,甚…...
使用Bert预训练模型处理序列推荐任务
最近的工作有涉及该任务,整理一下思路以及代码细节。 流程 总体来说思路就是首先用预训练的bert模型,在训练集的序列上进行CLS任务。对序列内容(这里默认是token id的sequence)以0.3左右的概率进行随机mask,然后将相…...
将word每页页眉单独设置
在进行论文排版的时候,总是会出现页眉的页码设置问题,比如出现奇数或偶数页码一致,尝试将前面页码改掉,后面再修改前面也进行了变动,将每页页眉单独设置: (1)在第一页的最后一行输入…...
rust怎么生成随机数?
关注我,学习Rust不迷路!! 在 Rust 中,有几种不同的方法可以实现随机数生成。以下是其中几种常见的方法,以及它们的优缺点: 1. 使用 rand crate: 优点: rand crate 是 Rust 中最常…...
python-Excel数据模型文档转为MySQL数据库建表语句(需要连接数据库)-工作小记
将指定Excel文档转为create table 建表语句。该脚本适用于单一且简单的建表语句 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 17:50 # Author: 水兵没月 # File : excel_2_mysql建表语句.py import reimport pandas as pd import mysql.connectordb 库名mydb m…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
