学习c#的第九天

C# 可空类型(Nullable)

C# 可空类型(Nullable)

可空类型允许我们在值类型中包含 null 值,这在处理数据库查询结果或需要表示缺失值的情况时非常有用。

声明一个可空类型的语法如下:

< data_type>? <variable_name> = null;

其中 <data_type> 是基础的值类型,例如 int、bool 等,? 符号表示这是一个可空类型,<variable_name> 是变量名,= 后面的 null 表示初始时该可空类型变量的值为 null。

对于 Nullable<T> 类型,编译器会执行一些特殊的处理,使得我们可以将 null 赋值给值类型,而不会出现编译错误。同时,Nullable<T> 类型也提供了一些属性和方法来方便地处理可空类型的值,比如 HasValue 来判断是否有值,Value 来获取值,GetValueOrDefault() 来获取值或默认值等。

使用可空类型可以很好地应对实际应用中遇到的可能存在缺失值的情况,同时也可以简化对数据库等数据源的处理。

 下面的实例演示了可空数据类型的用法:

using System;public class CalculatorApplication
{class NullablesAtShow{static void Main(string[] args){int? num1 = null;int? num2 = 45;double? num3 = new double?();double? num4 = 3.14157;bool? boolval = new bool?();// 显示值Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}",num1, num2, num3, num4);Console.WriteLine("一个可空的布尔值: {0}", boolval);Console.ReadLine();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

显示可空类型的值: , 45, , 3.14157
一个可空的布尔值:

Null 合并运算符( ?? )

空合并运算符 ?? 是 C# 中的一个方便的操作符,用于简化处理可能为 null 的情况。它提供了一种简洁的方式来检查并提供默认值,以避免空引用异常。

表达式 a ?? b 表示,如果 a 不为 null,则结果为 a 的值;如果 a 为 null,则结果为 b 的值。

以下是空合并运算符的一些特点和用法:

  • 当 a 不为 null 时,表达式的值为 a 的值。
  • 当 a 为 null 时,表达式的值为 b 的值。
  • a 和 b 的类型必须相同或兼容,否则会出现编译错误。
  • 空合并运算符可以在任何具有可空类型或引用类型的情况下使用。

下面是一个简单的示例,演示了空合并运算符的使用:

using System;public class CalculatorApplication
{class NullablesAtShow{static void Main(string[] args){int? x = null;int y = x ?? 5;  // 如果 x 不为 null,则 y 的值为 x 的值,否则为 5string name = null;string result = name ?? "Guest";  // 如果 name 不为 null,则 result 为 name 的值,否则为 "Guest"Console.WriteLine("y 的值: {0}", y);Console.WriteLine("result 的值: {0}", result);}}
}

当上面的代码被编译和执行时,它会产生下列结果:

y 的值: 5
result 的值: Guest

C# 数组(Array)

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

C# 中的数组

声明及初始化赋值数组

在 C# 中,声明数组需要指定数组的类型和名称,并可以选择指定数组的长度或初始化元素。

以下是几种常见的声明及初始化赋值数组的方式:

1、声明并初始化一个固定长度的数组:

int[] numbers = new int[5]; // 创建一个包含 5 个整数的数组
string[] names = new string[3]; // 创建一个包含 3 个字符串的数组

2、声明并初始化一个具有初始值的数组:

int[] numbers = new int[] { 1, 2, 3, 4, 5 }; // 创建一个包含 1、2、3、4 和 5 的整数数组
string[] names = new string[] { "Alice", "Bob", "Charlie" }; // 创建一个包含三个字符串的数组

3、使用简化的语法进行声明和初始化(仅适用于局部变量):

int[] numbers = { 1, 2, 3, 4, 5 }; // 类型推断,创建一个包含 1、2、3、4 和 5 的整数数组
string[] names = { "Alice", "Bob", "Charlie" }; // 类型推断,创建一个包含三个字符串的数组

在上述示例中,int[] 表示整数数组的类型,string[] 表示字符串数组的类型。使用 new 关键字创建一个新的数组实例,并指定数组的长度或初始化元素。

需要注意的是,数组的索引从 0 开始。可以通过索引来访问和修改数组中的元素,例如 numbers[0] 访问第一个元素,numbers[3] = 10 将第四个元素的值设置为 10。 

下面是一个实例:

using System;class Program
{static void Main(){// 声明并初始化一个整数数组int[] numbers = new int[5] { 1, 2, 3, 4, 5 };// 声明并初始化一个字符串数组string[] names = new string[] { "Alice", "Bob", "Charlie" };// 使用简化的语法进行声明和初始化int[] otherNumbers = { 6, 7, 8, 9, 10 };string[] otherNames = { "Dave", "Eve", "Frank" };// 访问和修改数组中的元素Console.WriteLine("numbers[0]: " + numbers[0]); // 输出:1Console.WriteLine("names[1]: " + names[1]); // 输出:Bobnumbers[3] = 12; // 修改数组中的元素Console.WriteLine("numbers[3] 修改后: " + numbers[3]); // 输出:12// 遍历数组并输出所有元素Console.WriteLine("数字数组中的所有元素:");foreach (int number in numbers){Console.WriteLine(number);}Console.ReadLine();}
}

在上述示例中,我们创建了一个 Program 类,并在 Main 方法中进行了数组的声明、初始化和操作。首先,我们声明并初始化了两个数组 numbers 和 names,然后使用简化的语法声明并初始化了 otherNumbers 和 otherNames 数组。

接下来,我们展示了如何访问和修改数组中的元素。使用索引可以获取特定位置的元素的值,也可以修改元素的值。

最后,我们使用 foreach 循环(也可以使用 for 循环来访问每个数组元素)遍历数组并逐个输出所有元素。

多维数组

多维数组是数组的一种特殊形式,它允许在一个数组中存储多个维度的数据。在 C# 中,我们可以创建二维甚至更高维度的数组来表示表格、矩阵、立方体等数据结构。

声明和初始化多维数组

在 C# 中,可以使用以下语法来声明和初始化二维数组:

// 声明并初始化一个二维整数数组
int [,] matrix = new int [3,4] {{0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */{4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */{8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

上述代码中,我们声明了一个名为 matrix 的二维整数数组,它包含 3 行和 4 列。

访问和操作多维数组

可以使用索引来访问多维数组中的元素。对于二维数组,我们使用两个索引来表示行和列:

// 访问和修改二维数组中的元素
matrix[0, 0] = 1; // 设置第一行第一列的元素值为 1
int value = matrix[1, 2]; // 获取第二行第三列的元素值

代码示例

using System;class Program
{static void Main(){// 声明并初始化一个二维整数数组int[,] matrix = new int[3, 4];// 给数组赋值matrix[0, 0] = 1;matrix[0, 1] = 2;matrix[0, 2] = 3;matrix[0, 3] = 4;matrix[1, 0] = 5;matrix[1, 1] = 6;matrix[1, 2] = 7;matrix[1, 3] = 8;matrix[2, 0] = 9;matrix[2, 1] = 10;matrix[2, 2] = 11;matrix[2, 3] = 12;// 访问和输出二维数组中的元素Console.WriteLine("matrix[1, 2]: " + matrix[1, 2]); // 输出:7// 遍历二维数组并输出所有元素Console.WriteLine("矩阵阵列中的所有元素:");for (int i = 0; i < matrix.GetLength(0); i++){for (int j = 0; j < matrix.GetLength(1); j++){Console.Write(matrix[i, j] + " ");}Console.WriteLine();}Console.ReadLine();}
}

当上面的代码被编译和执行时,它会产生下列结果:

matrix[1, 2]: 7
矩阵阵列中的所有元素:
1 2 3 4
5 6 7 8
9 10 11 12

交错数组

交错数组(jagged array)是 C# 中的一种特殊数组形式,它允许在一个数组中存储其他数组作为其元素。与普通的多维数组不同,交错数组的各个维度的长度可以不同,因此它可以用来表示不规则的数据结构。

声明和初始化交错数组

在 C# 中,可以使用以下语法来声明和初始化一个交错数组:

// 声明并初始化一个交错数组
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 2, 3 };
jaggedArray[1] = new int[] { 4, 5 };
jaggedArray[2] = new int[] { 6, 7, 8, 9 };

在上述示例中,我们声明并初始化了一个名为 jaggedArray 的交错数组。它包含了三个子数组,每个子数组的长度可以不同。

访问和操作交错数组

可以使用索引来访问交错数组中的元素,例如:

// 访问并输出交错数组中的元素
Console.WriteLine(jaggedArray[1][0]); // 输出:4

实例

using System;class Program
{static void Main(){// 声明并初始化一个交错数组int[][] jaggedArray = new int[3][];jaggedArray[0] = new int[] { 1, 2, 3 };jaggedArray[1] = new int[] { 4, 5 };jaggedArray[2] = new int[] { 6, 7, 8, 9 };// 访问并输出交错数组中的元素Console.WriteLine("jaggedArray[1][0]: " + jaggedArray[1][0]); // 输出:4// 遍历交错数组并输出所有元素Console.WriteLine("交错数组中的所有元素:");for (int i = 0; i < jaggedArray.Length; i++){for (int j = 0; j < jaggedArray[i].Length; j++){Console.Write(jaggedArray[i][j] + " ");}Console.WriteLine();}Console.ReadLine();}
}

在上述示例中,我们声明并初始化了一个名为 jaggedArray 的交错数组。然后,我们访问了交错数组中的特定元素,并使用嵌套的循环遍历了整个交错数组,并逐个输出了所有元素。

交错数组与二维数组的区别

  1. 维度不同:交错数组是由多个一维数组组成的数组,每个子数组的长度可以不同。而二维数组是一个由固定长度的一维数组组成的矩阵,每个一维数组具有相同的长度。

  2. 内存布局不同:交错数组的各个子数组在内存中是连续存储的,但各个子数组之间可能不连续。而二维数组是在内存中按矩阵布局连续存储的。

  3. 初始化方式不同:交错数组可以通过逐个初始化子数组来构建,每个子数组的长度可以根据需要动态设置。而二维数组需要在声明时指定每个维度的长度,并且无法在后续修改。

  4. 访问方式不同:由于内存布局不同,访问交错数组和二维数组的元素的方式也有所不同。对于交错数组,我们首先访问主数组的元素,然后再通过索引访问子数组的元素。而对于二维数组,我们可以直接通过两个索引访问元素,从而获得更直观的访问方式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【rl-agents代码学习】01——总体框架

文章目录 rl-agent Get startInstallationUsageMonitoring 具体代码 学习一下rl-agents的项目结构以及代码实现思路。 source: https://github.com/eleurent/rl-agents rl-agent Get start Installation pip install --user githttps://github.com/eleurent/rl-agentsUsage…

大数据-之LibrA数据库系统告警处理(ALM-12041 关键文件权限异常)

告警解释 系统每隔一个小时检查一次系统中关键目录或者文件权限、用户、用户组是否正常&#xff0c;如果不正常&#xff0c;则上报故障告警。 当检查到权限等均正常&#xff0c;则告警恢复。 告警属性 告警ID 告警级别 可自动清除 12041 严重 是 告警参数 参数名称 …

​ArcGIS Pro怎么生成山顶点

山顶点是指山脉、山丘或山脉系统中最高的地点&#xff0c;通常是山的最高峰&#xff0c;这是山地地貌中的最高点&#xff0c;往往是山脉的标志性特征之一&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro获取山顶点&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用…

大洋钻探系列之二IODP 342航次是干什么的?(上)

本文简单介绍一下大洋钻探IODP 342航次&#xff0c;从中&#xff0c;我们一窥大洋钻探航次的风采。 IODP342的航次报告在网络上可以下载&#xff0c;英文名字叫《Integrated Ocean Drilling ProgramExpedition 342 Preliminary Report》&#xff0c;航次研究的主要内容是纽芬兰…

虹科方案 | 汽车电子电气架构设计仿真解决方案

来源&#xff1a;虹科汽车电子 虹科方案 | 汽车电子电气架构设计仿真解决方案 导读 本文将介绍面向服务&#xff08;SOA&#xff09;的汽车TSN网络架构&#xff0c;并探讨RTaW-Pegase仿真与设计软件在TSN网络设计中的应用。通过RTaW将设计问题分解&#xff0c;我们可以更好地理…

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…

前端面试之事件循环

什么是事件循环 首先&#xff0c; JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;这并不意味着单线程就是阻塞&#xff0c;而是实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所欲任务都可以分为&#xff1a; 同步任务…

hive里因为列名用了关键字导致建表失败

代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …

低代码、零代码开源与不开源:区别解析

在如今日益发展的数字时代&#xff0c;程序开发变得越来越重要。为了实现日益提高的业务需求&#xff0c;开发人员必须能够以更高效、更灵活的方式构建和交货软件解决方案。低代码和零代码开源是近几年流行的两种开发方法。本文将探讨它们与传统非开源程序开发的差别&#xff0…

Linux Mint 21.3 将搭载 Cinnamon 6.0 和实验性 Wayland 支持

导读Wayland 会话可能在 Linux Mint 23 系列中成为默认选项&#xff0c;预计将在 2026 年实现。 Linux Mint 项目今天在他们的每月新闻通讯中 宣布&#xff0c;他们已经开始着手在未来的 Linux Mint 发行版中实施 Wayland 会话&#xff0c;最初将在 Linux Mint 21.3 中提供。 …

蓝桥杯 选择排序

选择排序的思想 选择排序的思想和冒泡排序类似&#xff0c;是每次找出最大的然后直接放到右边对应位置&#xff0c;然后将最 右边这个确定下来&#xff08;而不是一个一个地交换过去&#xff09;。 再来确定第二大的&#xff0c;再确定第三大的… 对于数组a[]&#xff0c;具体…

计算机毕设 推荐系统设计与实现 协同过滤推荐算法

文章目录 0 前言简介常见推荐算法协同过滤分解矩阵聚类深度学习 协同过滤原理系统设计示例代码(py) 系统展示系统界面推荐效果 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕…

ts学习02-数据类型

新建index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…

【Python Opencv】图片与视频的操作

文章目录 前言一、opencv图片1.1 读取图像1.2 显示图像1.3 写入图像1.4 示例代码 二、Opencv视频2.1 从相机捕获视频获取摄像头一帧一帧读取显示图片VideoCapture 中的get和set函数示例代码 2.2 从文件播放视频示例代码 2.3 保存视频示例代码 总结 前言 在计算机视觉和图像处理…

Java --- JVM的执行引擎

目录 一、执行引擎概述 1.1、执行引擎的工作过程 二、Java代码编译和执行的过程 三、解释器 3.1、解释器工作机制 3.2、解释器分类 3.3、解释器现状 四、JIT编译器 五、热点代码及探测方式 六、方法调用计数器 6.1、热点衰减 七、回边计数器 八、HotSpot VM设置程序…

Fabric区块链浏览器搭建

目录 一、创建区块链浏览器相关目录二、配置docker-compose三、配置区块链浏览器四、启动区块链浏览器 书接这一回 Fabric二进制建链&#xff0c;在建好链之后&#xff0c;将为这条链部署一个区块链浏览器。 Hyperledger Fabric区块链浏览器地址&#xff1a;https://github.co…

Python参数传递,从入门到精通

Python是一种非常灵活的编程语言&#xff0c;以多种方式定义和调用函数。其中一个关键方面是参数传递的灵活性。在Python中&#xff0c;可以通过位置、关键字、默认值和可变长度参数等多种方式来传递参数。 1. 位置参数 位置参数是最常见的参数传递方式。当调用一个函数时&am…

Python---元组的相关操作方法

由于元组中的数据不允许直接修改&#xff0c;所以其操作方法大部分为查询方法。 编号函数作用1元组[索引]根据索引下标查找元素2index()查找某个数据&#xff0c;如果数据存在返回对应的下标&#xff0c;否则报错&#xff0c;语法和列表、字符串的index方法相同3count()统计某…

外贸SEO是什么意思?谷歌优化有哪些平台?

外贸SEO优化最新指南&#xff1f;独立站谷歌SEO优化怎么做&#xff1f; 通过有效的外贸SEO策略&#xff0c;企业可以在国际市场上取得竞争优势&#xff0c;吸引更多的目标客户&#xff0c;并增加销售额。顺风船将探讨外贸SEO的重要性以及如何实施这一战略&#xff0c;以帮助您…

1000道精心打磨的计算机考研题,408小伙伴不可错过

提示&#xff1a;408考研人看过来&#xff0c;超精选计算机考研1000题&#xff01; 文章目录 前言1. 为什么是1000题&#xff1f;2. 有什么优势&#xff1f;【练学结合&#xff0c;助力强化】【难度适中&#xff0c;但不刁钻】【题目新颖&#xff0c;独具匠心】【考题预测&…