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

这篇具有很好参考价值的文章主要介绍了C#8.0本质论第三章--更多数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

3.1类型的划分

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

3.1.1值类型

C#8.0本质论第三章--更多数据类型,C#学习笔记,c#,开发语言,学习,笔记

3.1.2引用类型

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

C#8.0本质论第三章--更多数据类型,C#学习笔记,c#,开发语言,学习,笔记

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()方法将整个字符串作为字符数组返回。文章来源地址https://www.toymoban.com/news/detail-659588.html

到了这里,关于C#8.0本质论第三章--更多数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三章作业:关系数据库

    同一个关系模型的任意两个元组值(C ) A 必须全同 B 可全同 C 不能全同 D 以上都不是 设W=R∞S,且W,R,S的元组个数分别为p,m,n,那么三者之间满足 D。 A. p(m+n) B. p≤(m+n) C. p(m×n) D. p≤(m×n) σF1(σF2(E))与 A 等价。 A. σF1∧F2(E) B. σF1(E) C. σF2(E) D. σF1∨F2(E) 设关系R和S的属性个数分别

    2023年04月25日
    浏览(55)
  • 计网第三章(数据链路层)(五)

    目录 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 2.以太网交换机的基本原理 3.具体实现过程 大家可能注意到平常做题时有叫两层交换机,或者三层交换机的。 两层交换机 就是第四节(计网第三章(数据链路层)(四)_永无魇足的博客-CSDN博客)所讲

    2024年02月12日
    浏览(34)
  • 计网第三章(数据链路层)(三)

    目录 一、点对点协议PPP 二、广播信道 1.媒体接入控制 (1)静态划分信道: (2)动态接入控制: 受控接入: 随机接入: CSMA/CD协议: CSMA/CA协议: 在第一篇里有提到数据链路层的信道分为两种:点对点信道和广播信道。 PPP协议就属于点对点信道上的协议。 如果对前面数据

    2024年02月12日
    浏览(31)
  • 数据结构 第三章 线性表(三)

      🚀 写在最前: 在前面学习了单链表的基本操作,这篇文章学习 双链表 ,以及 双链表的一些基本操作 。 🚀: 求个关注😀,让我们一起探索计算机的奥秘! 双链表一个节点含有两个指针域,前指针域指向前一个节点,后一个指针域指向后一个节点; 那为什么有了单链

    2024年04月15日
    浏览(40)
  • 第三章 数据链路层【计算机网络】

    2023-7-7 16:29:11 以下内容源自《【计算机网络】》 仅供学习交流使用 第二章 物理层【计算机网络】 计算机网络(第8版) 谢希仁 编著 3.1.1 数据链路和帧 3.1.2 三个基本问题 数据链路层协议有许多种,但有A个基本问题是: 封装成帧、透明传输和差错检测 。下面分别讨论这三个

    2024年02月13日
    浏览(48)
  • 大数据分析-第三章 大数据存储和处理

    关系型数据库 NoSQL:泛指非关系型数据库,比如MongoDB 全文检索框架:Elasticsearch 行式存储:大数据量查询,如果没有索引,则会遍历 列式存储:可以大量的压缩空间 位图索引 位图索引的例子,如下图所示,我们可以存储为 “男”:100101 “女”:011010 行号 姓名 1 男 2 女 3 女 4 男

    2024年02月09日
    浏览(55)
  • 计算机网络第三章——数据链路层(下)

    提示:任何命运无论多么复杂,都只是反映在一瞬间 局域网也有无线局域网, 局域网的特性主要由三个要素决定:拓扑结构、传输介质,介质访问控制方式,最重要的是介质访问控制方式,它决定着局域网的技术特性 我们日常生活中局域网主要是使用总线型这种结构,若是中

    2024年02月09日
    浏览(55)
  • 计算机网络第三章——数据链路层(中)

    数声风笛离亭晚,君向潇湘我向秦 主要任务:为使用介质的每个结点隔离来自同一信道上其他结点所传送的信号,以协调活动结点的传输 介质访问控制(Medium Access Control,MAC)子层: 用来决定广播信道中信道分配 总线型和星型都是广播式通信,看一下目的地址是否是本主机,若是

    2024年02月09日
    浏览(52)
  • 计算机网络-笔记-第三章-数据链路层

    一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 三、第三章——数据链路层 1、数据链路层概述(帧) (1)封装成帧、差错检测、可靠传输(简单介绍) (2)CS

    2024年02月10日
    浏览(53)
  • 计算机网络第三章——数据链路层(上)

    提示:节物风光不相待。桑田碧海须臾改 这一章主要学习数据链路层的功能和应用, 功能中最主要的也是最重要的就是封装成帧和透明传输 ,封装成帧就是帮我过滤一下物理层,这里就是将物理层的几个bit封装成帧, 帧就是数据链路层的传输单位或者说是传输单元 ,透明

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包