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

news2024/11/22 5:29:31

在这里插入图片描述

文章目录

  • 类型转换
    • 字符转数字
      • 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对应四种判断

  • ET 类型时
  • 当为T的派生类,子类,继承类(包括类和接口)时。
  • ET的可为空类型T?,且E不为空时
  • ET的转换涉及装箱拆箱时

让我们分别看看这四种对应的判断:

ET 类型时:

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

ET的可为空类型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);
}

ET时涉及装箱拆箱时

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 operatorexplicit 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: 7

        Digit digit = (Digit)number;
        Console.WriteLine(digit);  // output: 7
    }
}

使用自定义类型可以定义隐式转换和显示转换,但是要注意类型匹配。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具,它能够创建高性能、一致性的备份,并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下,复制InnoDB存储引擎的数据文件和事务日…

react18之08自定义hook (简单的axios-get、修改浏览器title、localStorage、获取滚动条位置、img转换为base64)

目录 react18之自定义hook ()01:自定义一个 简单的axios hook 发起get请求useHttp.jsx使用useHttp hook效果 02:自定义一个 修改浏览器title hook03:自定义一个 localStorage(获取、存储、移除) hookuseLocalStorage.jsx使用hook效果 04&…

【JVM】 垃圾回收篇——自问自答(1)

Q什么是垃圾: 运行程序中,没用任何指针指向的对象。 Q为什么需要垃圾回收? 内存只分配,不整理回收,迟早会被消耗完。 内存碎片的整理,为新对象腾出空间 没有GC程序无法正常进行。 Q 哪些区域有GC&#…

【C++学习】STL容器——list

目录 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比…

On Evaluation of Embodied Navigation Agents 论文阅读

论文信息 题目:On Evaluation of Embodied Navigation Agents 作者:Peter Anderson,Angel Chang 来源:arXiv 时间:2018 Abstract 过去两年,导航方面的创造性工作激增。这种创造性的输出产生了大量有时不…

idea-Invalidate caches选项

Clear file system cache and Local History: 清除 IntelliJ IDEA 缓存和本地历史记录,注意要保存现有的信息 Clear VCS Log caches and indexes: remove the cache and indexes of the VCS Log. 这个选项的意思是清除版本控制系统日志的缓存和索引。VCS Log 是 In…

VBA技术资料MF40:VBA_计数筛选状态的数据行数

【分享成果,随喜正能量】人唯有与喜欢的事物发展关系,不管是人或者是物还是事,包括喜欢自己外表、个性的部分,喜欢自己做的事,喜欢自己的创造,喜欢的风景……才给人带来对自己的认同。在与喜欢的事物互动关…

从小白到数据库达人!Mysql优化让你的社招面试无往不利!

大家好,我是小米,在这个美好的时刻又迎来了我们的技术小窝。今天,我们要聊一聊一个在数据库领域中无比重要的话题 —— Mysql 优化!是不是感觉很兴奋呢?废话不多说,让我们直接进入今天的主题。 背景知识 …

Hadoop理论及实践-HDFS的Namenode及Datanode(参考Hadoop官网)

HDFS有什么特点,被设计做什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。有一下几个特点: HDFS是一个高度容错性的系统,具有高容错、高可靠性、高扩展性的特点,适合部…

2.两数相加(题解)

两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…

数学建模—多元线性回归分析(+lasso回归的操作)

第一部分:回归分析的介绍 定义:回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的人数就是,通过研究自变量X和因变量Y的相关关系,尝试去解释…

MongoDB 使用总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

MyCat配置文件schema.xml讲解

1.MyCat配置 1.1 schema标签 如果checkSQLschema配置的为false,那么执行DB01.TB_ORDER时就会报错,必须用use切换逻辑库以后才能进行查询。 sqlMaxLimit如果未指定limit进行查询,列表查询模式默认为100,最多只查询100条。因为用mycat后默认数…

【多线程】synchronized 原理

1. 写在前面 本章节主要介绍 synchronized 的一些内部优化机制,这些机制存在的目的呢就是让 synchronized 这把锁更高效更好用! 2. 锁升级/锁膨胀 JVM 将 synchronized 锁分为以下四种状态: 无锁,偏向锁,轻量级锁&…

ENSP软件的基本使用命令(第三十一课)

ENSP软件的基本使用命令(第三十一课) 下面的图片是今天操作的核心基础操作 1 命令行页面 交换机 路由器 PC机 分别展示一下 页面的样子 2 基本命令结构

K8S系列文章 之 容器存储基础 Volume

Volume Volume是容器数据卷。我们经常创建删除一些容器,但有时候需要保留容器中的一些数据,这时候就用到了Volume。它也是容器之间数据共享的技术,可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人…

Last-Mile Embodied Visual Navigation 论文阅读

论文阅读 题目:Last-Mile Embodied Visual Navigation 作者:JustinWasserman, Karmesh Yadav 来源:CoRL 时间:2023 代码地址:https://jbwasse2.github.io/portfolio/SLING Abstract 现实的长期任务(例如…

Spring Cloud Gateway过滤器GlobalFilter详解

一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守…

10亿数据、查询<10s,论基于OLAP搭建广告系统的正确姿势

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 由于流量红利逐渐消退,越来越多的广告企业和从业者开始探索精细化营销的新路径,取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在…

抓包神器-burp

Burp Suite是一款信息安全从业人员必备的集成型的渗透测试工具,它采用自动测试和半自动测试的方式,包含了 Proxy,Spider,Scanner,Intruder,Repeater,Sequencer,Decoder,Comparer等工具模块。通过拦截HTTP/HTTPS的web数据包,充当浏览器和相关应…