C#8.0本质论第三章--更多数据类型

news2024/11/17 3:40:23

C#8.0本质论第三章–更多数据类型

3.1类型的划分

一个类型要么是值类型,要么是引用类型。区别在于拷贝方式:值类型数据总是拷贝值;引用类型的数据总是拷贝引用。

3.1.1值类型

在这里插入图片描述

3.1.2引用类型

引用类型的变量存储对数据存储位置的引用。

在这里插入图片描述

3.2将变量声明为可空

null值对于数据库编程来说尤为重要,因为很多数据库都允许字段的值为null,可以使用可空修饰符将类型声明为允许或不允许空值

3.2.1对null值引用类型变量进行解引用

判断一个变量的值是否为null,可以用is操作符,虽然也可以用==,但由于等于操作符可能被重写并实现不同的行为,因此判断null最好使用is操作符。

在C#6.0中引入的用于处理null值的操作符交“null值条件(null condition)”操作符,该操作先判断一个变量是否为null,再对其解引用。

//先判断text变量是否为空,为空则赋值为null,否则读取length值
int? length = text?.length;

3.2.2可空值类型

技术上讲,一个用可空修饰符声明的值类型变量仍然是值类型,而不会变成引用类型,因此,对一个被赋值为null的值类型变量进行解引用时,大部分情况下不会发生null值异常,因为值类型的方法和属性都是基于模板类Nullable实现的

3.2.3可空引用类型

在C#8.0中,声明任何类型的变量时,默认都为不可空,为了确保兼容旧代码,C#默认情况不支持引用类型的可空特性。想要启用此特性,需要使用**#nullable语句**,或在项目属性配置中启用该特性。

3.3隐式类型的局部变量

C#3.0新增了上下文关键字var来声明隐式类型的局部变量,在声明时初始化。(类似于C++11中的auto,在编译时确定类型)

C#3.0新增var的真正目的是支持匿名类型,匿名类型是在方法内部动态声明的数据类型:

var patent1 = new {Title = "Bifocals",YearOfPublic = "1784"};
System.Console.WriteLine($"{patent1.Title} {patent1.YearOfPublic}");

自从C#7.0引入元组语法后,匿名类型几乎就用不着了。

3.4元组

C#7.0提供了元组(tuple),元组允许在一条语句中完成对所有变量的赋值:

(string country, string capital, double gdpPerCapita) = ("Burundi", "Bujumbura", 263.67);

详细见书本。

3.5数组

new关键字和对应的类型在声明时可选,数组可以不提供初始值,这样每一项都被初始化成默认值,不提供初始值就必须指定数组大小,大小可以是运行时计算的变量(其实就是C++里new一个数组)。指定的数组大小必须和大括号里的元素数量匹配(与C++不同,C++里可以缺少,后面缺少的就初始化为默认值)。

从C#3.0起可以不指定数据类型。

3.5.1数组的声明

string[] language;

方括号指定了数组的**秩(rank)**或者说维数,与C++不同,数组声明的括号紧跟在类型之后,这样所有的类型信息都在一起。

某一维上的元素数量不是变量声明的一部分。(比如C++里声明 int a[10]; 带着大小,但是C#不同,声明的类型是不带大小的,为什么呢,我认为是因为C#里的数组赋值其实是动态分配,它是引用类型,数据存放在堆里,类似于C++里的 int* a=new int[n]; ,而int a[10];是放在栈里的,编译的时候就要确定大小了)。

3.5.2数组实例化和赋值

数组声明之后如果还想赋值,就需要使用new关键字

string[] language;
language = new string[]{"C#","C++","Lua"};

C#以类似的方式处理多维数组

int[,] cells = new int[3,3];
int[,] cell = {
    {1,2,3},
    {1,2,3},
    {1,2,3}
};

数组包含三个int[]类型的元素,每个一维大小必须完全一样,多维数组也称为“矩形数组”。

还可以定义交错数组(jagged array),也就是由数组构成的数组。要求为内部每个数组都创建数组实例。

int[][] cells =
{
    new int[]{1,2,3},
    new int[]{4,5},
    new int[]{6,}
};

3.5.3数组的使用

从C#8.0开始,可以使用相对于末尾元素的索引来访问数组,该操作需要用到反向索引操作符(index from end operator),有时也称作操作符或者"帽子操作符",索引1代表数组最后一个元素,索引^0代表最后一个元素的下一个位置。CLR能防住所有C#代码越界。

Length返回数组中元素的总数,如果是多维数组,比如大小是2x3x3那么Length会返回元素总数18,对于交错数组,Length只作用于外部数组,会返回2。

C#8.0提供了一个新的访问方法:数组切片,用**区间操作符…**表示,

string[] languages = new [] {
    "C#", "COBOL", "Java",
    "C++", "TypeScript", "Swift",
    "Python", "Lisp", "JavaScript"};
 
Console.WriteLine($@"  0..3: {
    string.Join(", ", languages[0..3])  // C#, COBOL, Java
}");
Console.WriteLine($@"^3..^0: {
    string.Join(", ", languages[^3..^0]) // Python, Lisp, JavaScript
}");
Console.WriteLine($@" 3..^3: {
    string.Join(", ", languages[3..^3]) // C++, TypeScript, Swift
}");
Console.WriteLine($@"  ..^6: {
    string.Join(", ", languages[..^6])  // C#, COBOL, Java
}");
Console.WriteLine($@"   6..: {
    string.Join(", ", languages[6..])  // Python, Lisp, JavaScript
}");
Console.WriteLine($@"    ..: {
    // C#, COBOL, Java, C++, TypeScript, Swift, Python, Lisp, JavaScript
    string.Join(", ", languages[..])  // Python, Lisp, JavaScript
}");
Console.WriteLine($@"    ..: {
    // C#, COBOL, Java, C++, TypeScript, Swift, Python, Lisp, JavaScript
    string.Join(", ", languages[0..^0])  // Python, Lisp, JavaScript
}");

在.NET/C#中,索引和区间是一等类型,它们的引用不局限于访问数组。索引不是个单纯的整数,而是一种类型(我试了下,需要C#8.0)

System.Index index = ^42;

System.Index有两个属性,一个名为Value,类型为int,另一个名为IsFromEnd,类型为bool。此外用于表示区间的类型为System.Range。在这两个类型的帮助下,可以设计自己的集合类。

更多数组方法:Sort(),BinarySearch(),Reverse(),Clear()

使用BinarySearch()时如果不存在,会返回负值,可应用~index返回比目标元素大的第一个元素的索引。

Cleart()方法不删除数组元素,只是将每个元素都设为其默认值。

获取特定维的长度不是用Length属性,而是用数组的GetLength()实例方法。

创建数组的拷贝可以用Clone()方法。

3.5.4字符串作为数组使用

可以使用ToCharArray()方法将整个字符串作为字符数组返回。
一个元素的索引。

Cleart()方法不删除数组元素,只是将每个元素都设为其默认值。

获取特定维的长度不是用Length属性,而是用数组的GetLength()实例方法。

创建数组的拷贝可以用Clone()方法。

3.5.4字符串作为数组使用

可以使用ToCharArray()方法将整个字符串作为字符数组返回。

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

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

相关文章

Datawhale Django入门组队学习Task02

Task02 首先启动虚拟环境(复习一下之前的) 先退出conda的, conda deactivate然后cd到我的venv下面 ,然后cd 到 scripts,再 activate (powershell里面) 创建admin管理员 首先cd到项目路径下&a…

笨办法学python3进阶篇pdf,笨方法学 python3怎么样

本篇文章给大家谈谈《“笨办法”学python(第3版)》,以及笨办法学python3进阶篇pdf下载,希望对各位有所帮助,不要忘了收藏本站喔。 接着前天的总结 习题21:函数可以返回某些东西 定义函数的加减乘除,以及嵌套使用 习题2…

PHP实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

本示例使用的读卡器&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) <?php mb_http_output(utf-8); $port88; $socket socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $bool socket_bind($socket, "0.0.0.0",…

深度学习入门-3-计算机视觉-卷积神经网络

一、计算机视觉 1.概述 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

Python进阶系列(二)— 类与对象

对象 Python是一个面向对象的语言Python的内置类型实例都是对象对象包含数据和方法集合 类 类是对现实中的事物进行抽象的数据表示&#xff0c;用来定义对象们的数据结构&#xff0c;对象由实例化类获得。 例如这是一个玩家类&#xff0c;玩家有x&#xff0c;y和生命值三个…

程序的机器级表示

程序的机器级表示 程序编码数据格式访问信息的方式 所有的高级语言&#xff0c;都会被计算机翻译为机器代码&#xff0c;然后再根据汇编代码生成可执行的机器代码。二进制的机器代码我们人类肯定是读不懂了&#xff0c;但是汇编代码还是可以简单了解一下的。CPU 的 PC、寄存器、…

ATTCK覆盖度97.1%!360终端安全管理系统获赛可达认证

近日&#xff0c;国际知名第三方网络安全检测服务机构——赛可达实验室&#xff08;SKD Labs&#xff09;发布最新测试报告&#xff0c;360终端安全管理系统以ATT&CK V12框架攻击技术覆盖面377个、覆盖度97.1%&#xff0c;勒索病毒、挖矿病毒检出率100%&#xff0c;误报率0…

详解web前端长度单位(px、em、rem、%、vw/vh、vmin/vmax、vm、calc())

1&#xff09;简介 在前端开发中&#xff0c;会遇到各种不同类型的长度单位&#xff0c;比如px,em,rem等。 而整体的长度单位分为两大类&#xff1a; 绝对长度单位包括&#xff1a;in,cm, mm, q, pt, pc, px 相对长度单位包括&#xff1a;em, rem, %, vw, vh, vmax, vmin, vm,…

python基础语法 百度网盘,python基础语法个人笔记

大家好&#xff0c;本文将围绕python基础语法 百度网盘展开说明&#xff0c;python基础语法个人笔记是一个很多人都想弄明白的事情&#xff0c;想搞清楚python基础语法合集下载需要先了解以下几个事情。 前言 Python是一种多功能语言。它经常用作Web应用程序的脚本语言&#xf…

VSCode无法从Extensions下载工具时,把工具下载到本地并添加到VSCode编辑器

从VSCode 的 Extensions 下载 下载报错&#xff1a;Error while installing ...... extension. Please check the log for more details. 由于内网限制&#xff08;或者其他网络限制&#xff09;无法正常下载扩展工具到VSCode编辑器&#xff0c;可以把工具下载到本地再添加到V…

mysql知识点+面试总结

目录 1 mysql介绍 2 数据库常见语法 3 数据库表的常见语法 4 其他常见语法&#xff08;日期&#xff0c;查询表字段&#xff09; 5 JDBC开发步骤 6 索引 6.1 索引常见语法 7 常见面试总结 8 java代码搭建监控页面 1 mysql介绍 数据库&#xff1a;存储在硬盘上的文件系统…

如何做好科技文献资料的翻译!

我们知道&#xff0c;科技文献是工程技术人员的重要参考文献&#xff0c;翻译科技文献资料有助于促进国内外科技知识和技术的传播。那么&#xff0c;如何做好科技文献资料的翻译&#xff0c;专业科技文献翻译哪家好&#xff1f; 据了解&#xff0c;科技文献翻译是一种以应用为主…

chatglm2-6b模型在9n-triton中部署并集成至langchain实践 | 京东云技术团队

一.前言 近期&#xff0c; ChatGLM-6B 的第二代版本ChatGLM2-6B已经正式发布&#xff0c;引入了如下新特性&#xff1a; ①. 基座模型升级&#xff0c;性能更强大&#xff0c;在中文C-Eval榜单中&#xff0c;以51.7分位列第6&#xff1b; ②. 支持8K-32k的上下文&#xff1b…

【Leetcode】84.柱状图中最大的矩形(Hard)

一、题目 1、题目描述 给定 n n n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10示例2:…

【Spring系列篇--关于IOC的详解】

目录 面试经典题目&#xff1a; 1. 什么是spring&#xff1f;你对Spring的理解&#xff1f;简单来说&#xff0c;Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.什么是IoC&#xff1f;你对IoC的理解&#xff1f;IoC的重要性?将实例化对象的权利从程序员…

安全学习DAY16_信息打点-CDN绕过

信息打点-CDN绕过 文章目录 信息打点-CDN绕过本节思维导图相关链接&工具站&项目工具前置知识&#xff1a;CDN配置&#xff1a;配置1&#xff1a;加速域名-需要启用加速的域名配置2&#xff1a;加速区域-需要启用加速的地区配置3&#xff1a;加速类型-需要启用加速的资源…

「Qt」文件读写操作

0、引言 我们知道 C 和 C 都提供了文件读写的类库&#xff0c;不过 Qt 也有一套自己的文件读写操作&#xff1b;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile。 1、QFileDialog 文件对话框 一般的桌面应用程序&#xff0c;当我们想要打开一个文件时&#xff0c;通常会弹…

ArcGIS Pro基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例全流程科研能力提升

目录 第一章 入门篇 GIS理论及ArcGIS Pro基础 第二章 基础篇 ArcGIS数据管理与转换 第三章 数据编辑与查询、拓扑检查 第四章 制图篇 地图符号与版面设计 第五章 空间分析篇 ArcGIS矢量空间分析及应用 第六章 ArcGIS栅格空间分析及应用 第七章 影像篇 遥感影像处理 第八…

Azure如何启用网络观察应用程序

文章目录 基础概念介绍实操 基础概念介绍 Azure中的网络观察应用程序是一种用于监视和诊断Azure网络的工具。它提供了一种集中管理和监控网络流量、连接性和性能的方式。网络观察应用程序能够提供网络流量分析、连接监视、性能监视和故障诊断等功能&#xff0c;用于帮助管理员…

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");