学习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 的值,否则为 5

            string 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]); // 输出:1
        Console.WriteLine("names[1]: " + names[1]); // 输出:Bob

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

蓝桥杯 选择排序

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

50个值得关注的生成式AI初创企业【2023】

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 生成式AI初创公司已成为科技界最新、最强大的参与者&#xff0c;它们利用自然语言处理、机器学习和其他形式的人工智能为各种业务用例生成…

总结MYSQL中VHARCHAR和TEXT

前几天在设计表结构时&#xff0c;针对表中的一个字段使用text还是使用varchar是受到了开发同学的挑战。本篇文章对text和varchar的区别做个总结。 VHARCHAR和TEXT对比 char(n)varchar(n)中括号中n代表字符的个数&#xff0c;并不代表字节个数&#xff0c;所以当使用了中文的…

实战 | 基于卷积神经网络的蘑菇识别微信小程序

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.13 Last edited: 2023.11.13 导读&#xff1a;其实没啥难的&#xff0c;主要是随手搞了就发出来把&#xff0c;太久没有水过帖子了&…

LCA

定义 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 性质 如果 不为 的祖先并且 不为 的祖先&#xff0c;那么 分别处于 的两棵不同子树中&#…

Python高级语法---Python内存管理机制

文章目录 1. 内存管理基础引用计数2. 垃圾回收机制垃圾回收3. 使用weakref处理循环引用weakref模块总结Python是一种高级编程语言,其内存管理机制高效且用户友好。这篇文章将详细介绍Python的内存管理基础、垃圾回收机制,以及如何使用weakref模块处理循环引用。我们将通过简单…

同为科技(TOWE)主副控智能自动断电桌面PDU插排

在这个快节奏的现代社会&#xff0c;我们越来越需要智能化的产品来帮助我们提高生活质量和工作效率&#xff0c;同时&#xff0c;为各种家用电器及电子设备充电成为不少消费者新的痛点。桌面插排如何高效、安全地管理这些设备&#xff0c;成为了一个亟待解决的问题。同为科技&a…

CopyOnWriteArrayList内存占用过多

目录 一、CopyOnWriteArrayList二、CopyOnWriteArrayList的适用场景三、CopyOnWriteArrayList内存占用过多的解决方法四、CopyOnWriteArrayList.add()源码分析 大家好&#xff0c;我是哪吒。 一、CopyOnWriteArrayList CopyOnWriteArrayList是Java中的一个线程安全的ArrayLis…

负债1320万美元的【思宏集团/Neo-Concep】申请900万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于香港的思宏集团Neo-Concept International Group Holdings Limited(简称&#xff1a;思宏集团&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)

编辑员工和分类模块功能开发 1. 编辑员工1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 回显员工信息功能1.2.2 修改员工信息功能 1.3 功能测试 2. 分类模块功能开发2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码实现2.2.1 Mappe…

ip数据包

数据报文格式 首部 版本&#xff08;Version&#xff09; 版本字段占4bit&#xff0c;通信双方使用的版本必须一致。对于IPv4&#xff0c;字段的值是4。 首部长度&#xff08;Internet Header Length&#xff0c; IHL&#xff09; 占4bit&#xff0c;首部长度说明首部有多少…

Clickhouse学习笔记(13)—— Materialize MySQL引擎

该引擎用于监听 binlog 事件&#xff0c;类似于canal、Maxwell等组件 ClickHouse 20.8.2.3 版本新增加了 MaterializeMySQL 的 database 引擎&#xff0c;该 database 能映射到 MySQL中的某个database &#xff0c;并自动在ClickHouse中创建对应ReplacingMergeTree。 ClickHous…

MPLS VPN详解

了解MPLS VPN之前&#xff0c;要先了解一下MPLS。 了解MPLS之前&#xff0c;先回顾一下基于MAC地址的交换和基于IP地址的路由转发。 &#xff08;上篇主要是介绍基于mac地址的交换、基于IP地址的路由转发、MPLS详解&#xff09; &#xff08;下篇主要是MPLS VPN的网络结构、…

前端基础------margin上下传递

1&#xff0c;出现的原因及解决方法 ◼ margin-top传递 如果块级元素的顶部线和块级父元素的顶部线重叠&#xff0c;那么这个块级元素的margin-top值会传递给父元素 ◼ margin-bottom传递 如果块级元素的底部线和块级父元素的底部线重叠&#xff0c;并且父元素的高度是…

【Proteus仿真】【51单片机】停车场车位管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、红外传感器、74HC595模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示进入、驶出、剩余车位数&am…

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

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

学生五科成绩统计

随机生成10名学生姓名(包括自己)和五科成绩&#xff0c;将数据存入*.csv&#xff0c;读取保存的*.csv文本数据计算每个学生总分和平均分&#xff0c;并存入*.csv文本&#xff1b;打印总分排名前三学生信息&#xff1b;查找10学生各科最高最低分、中位分、平均分。 (笔记模板由p…

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

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

curl使用

文章目录 前言一、curl use case二、下载操作我使用第一种方式&#xff1a;不验证证书&#xff0c;果然下载下来了。而且是下载到当前的工作文件夹。C:\Users\xxx\test.zip如果自己想指定文件地址 前言 使用 curl 工具 一、curl use case Simple Usage Get the main page fro…