unity C#什么时候用“可空类型”

文章目录

  • 例子
    • 1. **声明一个可空类型变量:**
    • 2. **给可空类型变量赋值:**
    • 3. **检查可空类型变量是否有值:**
    • 4. **转换与比较:**
    • 5. **使用null合并运算符:**
  • 可空类型的重要意义
    • 1. **表示缺失或未知的值:**
    • 2. **避免NullReferenceException异常:**
    • 3. **与数据库和JSON等数据交互时的数据完整性:**
    • 4. **增强代码可读性和表达力:**
    • 5. **配合C#语言特性提升安全性:**
  • 什么时候用可空变量
    • 1. **数据库映射**:
    • 2. **函数返回值**:
    • 3. **用户输入验证**:
    • 4. **Optional Dependencies**:
    • `5. **类型安全与编译时检查**:`

在C#中,可空类型(nullable type)是一种特殊的类型系统结构,它允许值类型(例如整型int、布尔型bool等非引用类型)具有表示“没有值”或“未知值”的状态,即可以赋值为null。这是对C#标准值类型功能的扩展,因为在传统的C#中,值类型是不允许直接赋值为null的。

例子

1. 声明一个可空类型变量:

int? nullableInt = null;

上述代码声明了一个名为nullableInt的变量,它的类型是int?,这代表这是一个可空的整数类型。此时,nullableInt可以被赋予0至2,147,483,647之间的任何整数值,或者null。

2. 给可空类型变量赋值:

nullableInt = 42; // 正常赋值一个整数值

这样就将42赋给了nullableInt

3. 检查可空类型变量是否有值:

if (nullableInt.HasValue)
{Console.WriteLine($"The value is: {nullableInt.Value}"); // 输出实际值
}
else
{Console.WriteLine("The variable has no value.");
}

使用.HasValue属性来判断变量是否包含有效值,如果有,则通过.Value属性访问其内部的实际值。直接访问.Value而不检查.HasValue会导致运行时错误,因为尝试访问null可空类型变量的.Value会抛出System.InvalidOperationException异常。

4. 转换与比较:

int regularInt = nullableInt.GetValueOrDefault(); // 如果nullableInt为null,则返回默认值(对于int来说是0)
bool areEqual = nullableInt == 42; // 可以比较可空类型与普通类型或另一个可空类型

5. 使用null合并运算符:

C# 8.0引入了null合并运算符 ?. 和空条件运算符 ??,它们有助于简化可空类型的处理:

int safeValue = nullableInt ?? -1; // 如果nullableInt为null,则返回-1作为默认值
string message = nullableInt.HasValue ? nullableInt.Value.ToString() : "No value"; // 使用三元运算符处理
string anotherMessage = nullableInt?.ToString() ?? "No value"; // 使用?.和??组合简化表达式

通过这些例子,我们可以看到C#中的可空类型提供了一种安全的方式来处理可能缺失的数据,并在编译时和运行时提供了更好的类型安全性。

可空类型的重要意义

1. 表示缺失或未知的值:

在处理数据时,有些情况下值可能不存在或者尚未确定。例如,在数据库查询结果、API返回值或者用户输入中,某些值类型字段(如整数、日期等)可能为空。通过声明为可空类型(如 int?),可以明确表示这些字段不仅可以包含其原始类型的值,还可以表示“无值”或“未定义”的状态。

2. 避免NullReferenceException异常:

对于引用类型,直接访问null对象的属性或方法会抛出NullReferenceException异常。而在C#中,对非空值类型进行null赋值是不允许的。引入可空类型后,编译器可以提供静态检查,帮助开发者在编译阶段发现可能的null引用错误,从而降低运行时异常的风险。

3. 与数据库和JSON等数据交互时的数据完整性:

在与数据库交互时,许多数据库表字段允许存储NULL值。将这类字段映射到C#类时,使用可空类型能够准确地反映数据库中的实际状态。同样,在序列化和反序列化JSON等数据格式时,可空类型也能更好地兼容那些可能缺失的值。

4. 增强代码可读性和表达力:

可空类型有助于提高代码的清晰度和一致性。通过类型系统,其他开发者可以一眼看出某个变量是否可能为null,这有利于编写更易于理解和维护的代码。

5. 配合C#语言特性提升安全性:

C# 8.0及以上版本引入了nullable reference types和null相关操作符(如?.和??),它们与可空值类型一起工作,可以极大地简化对可能为null的值的操作,并在编译阶段提供额外的安全保障。

总结来说,声明可空类型是对C#类型系统的有效扩展,它增强了编程语言对于“无值”状态的表达能力,有助于减少潜在的运行时错误,同时提高了代码的健壮性、可读性和易维护性。

什么时候用可空变量

在编程中,尤其是在像C#这样的现代类型安全语言中,声明变量时决定是否使用可空类型(Nullable<T>T?)主要基于以下几种情况:

1. 数据库映射

  • 当从数据库中读取的数据可能包含 NULL 值,并且您希望在数据传输对象(DTO)、实体类或模型中精确反映这种可能性时,应使用可空类型。例如,如果一个表的列允许存储 NULL,则对应的属性可以声明为 int?DateTime?

2. 函数返回值

  • 如果某个函数或方法有时无法返回一个有意义的有效值,而需要表示“无结果”或者操作未成功时,返回一个可空类型是有意义的。这有助于避免使用特殊值(如0、-1或特定日期)来代表NULL状态,从而提高代码清晰度和安全性。

3. 用户输入验证

  • 在处理用户输入时,如果不保证输入总是存在或有效,那么接收这些输入的变量应当声明为可空类型,直到经过验证确认其有效性后才进行非空赋值。

4. Optional Dependencies

  • 当程序依赖于其他组件或服务,而这些依赖可能不存在或不提供有效响应时,相关的接口引用或其他类型的变量可以是可空的。

5. **类型安全与编译时检查**:

  • 使用可空类型能够使编译器强制执行更严格的安全性检查,防止在运行时因尝试访问null变量而导致的NullReferenceException异常。

总结来说,当变量的值在某些情况下可能不存在或不确定时,使用可空类型是一种良好的实践,因为它可以帮助开发者在编译阶段捕获潜在的空引用错误,并通过更明确的类型系统表达出该变量值的不确定性。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

每日一博 - 使用APIFOX调测 @RequestBody标注的对象

文章目录 概述发送 post 请求步骤1.新建接口&#xff0c;设置为 post 请求2. 填写 URL 和参数3.发送请求 实战 RequestBody 概述 APIFOX&#xff08;类似Postman&#xff09;提供了丰富的功能来支持用户发送包含各种信息的 POST 请求&#xff0c;如文本数据、JSON 或 XML 数据…

云卷云舒:AI for DB、DB for AI

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客https://blog.csdn.net/bishenghua/article/details/135050556 随着数据库和AI技术的分支同向演进&#xff0c;AI 和数据库间的关联越发紧密了。 大模型的演进发展&a…

element中el-cascader级联选择器只有最后一级可以多选

文章目录 一、前言二、实现2.1、设置popper-class和multiple2.2、设置样式 三、最后 一、前言 element-ui中el-cascader级联选择器只有最后一级可以多选&#xff0c;其它级只有展开子节点的功能&#xff0c;如下图所示&#xff1a; 可以观察到最后一级的li节点上没有属性aria-…

java基础知识点系列——基础语法(三)

java基础知识点系列——基础语法&#xff08;三&#xff09; 注释 注释概述 注释是在程序指定位置添加的说明性信息。注释不参与程序运行&#xff0c;仅起到说明作用。 注释分类 单行注释&#xff0c;格式&#xff1a;// 注释信息多行注释&#xff0c;格式&#xff1a;/* …

面向对象的三大特征之二:继承 --java学习笔记

什么是继承? 关键字extends,用这个关键字&#xff0c;可以让一个类和另一个类建立起父子关系 继承的特点&#xff1a;子类能继承父类的非私有成员&#xff08;成员变量、成员方法&#xff09;继承后对象的创建&#xff1a;子类的对象时由子类、父类共同完成的 代码演示&am…

Hex Editor的使用教程(VS Code)

Hex Editor&#xff08;十六进制编辑器&#xff09;是一种用于查看和编辑计算机文件的低级别编辑工具。与常规文本编辑器不同&#xff0c;它允许用户直接查看和修改文件的二进制数据。在 Hex Editor 中&#xff0c;数据通常以十六进制&#xff08;hex&#xff09;格式显示&…

Qt/QML编程学习之心得:使用camera摄像头(35)

汽车应用中,camera起到了越来越多的作用,数字化的作用,这点无可争议,而作为GUI设计工具,如何让Camera类的应用能更好的发挥作用呢? You can use Camera to capture images and movies from a camera, and manipulate the capture and processing settings that get appl…

EI论文复现:考虑多能互补的综合能源系统/虚拟电厂/微电网优化运行程序代码!

本程序参考EI论文《基于多能互补的热电联供型微网优化运行》&#xff0c;文章通过储能设备解耦热电联系&#xff0c;建立基于多能互补的综合能源系统/虚拟电厂/微电网优化运行模型。模型包含系统供给侧的多能互补协调与需求侧的综合能源响应两个方面&#xff0c;使供给侧通过能…

Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

733.图像渲染 题目链接&#xff1a;https://leetcode.com/problems/flood-fill 解法&#xff1a; 可以用深度优先搜索和广度优先搜索。 深度优先搜索。每次搜索到一个方格时&#xff0c;如果其与初始位置的方格颜色相同&#xff0c;就将该方格的染色&#xff0c;然后继续对…

Qt构建MSVC2015环境过程

Qt构建MSVC2015环境过程 前言 之前用的Qt都是基于默认的MinGW编译器&#xff0c;由于目前工作的QT界面主要是跑在X86上&#xff0c;所以记录一下Qt配置MSVC2015的配置过程。根据查阅了解以后&#xff0c;个人理解的MinGW跟MSVC的区别在于前者主要是用于跨平台程序构建&#x…

Redis命令 - Hashes命令组常用命令

1、HSET key field value 设置 key 指定的哈希集中指定字段的值。 HSET key field value 返回值&#xff1a;1代表field是一个新的字段。0代表field已存在 如果 key 指定的哈希集不存在&#xff0c;会创建一个新的哈希集并与 key 关联。如果字段在哈希集中存在&#xff0c;它将…

软件需求分析报告—word

技术要求 1.1接口要求 1.2可靠性&#xff0c;稳定性&#xff0c;安全性&#xff0c;先进性&#xff0c;拓展性&#xff0c;性能&#xff0c;响应。 2.系统安全需求 2.1物理设计安全 2.2系统安全设计 2.3网络安全设计 2.4应用安全设计 2.5用户安全管理 进主页获取更多资料

靶场实战(15):OSCP备考之VulnHub STAPLER

打靶思路 资产发现 主机发现服务发现漏洞发现&#xff08;获取权限&#xff09; 21端口/FTP服务 组件漏洞口令漏洞139端口/SMB服务 组件漏洞口令漏洞666端口/doom服务 组件漏洞其它漏洞80端口/HTTP服务 组件漏洞URL漏洞12380端口/HTTP服务 组件漏洞URL漏洞12380端口/HTTPS服务 …

gitee创建远程仓库并克隆远程仓库到电脑

1、首先点加号新建一个仓库 2、输入仓库名&#xff0c;路径会自动填充&#xff0c;填写简单的仓库介绍&#xff0c;先选择私有&#xff0c;在仓库创建之后&#xff0c;可以改为开源 3、打开建好的仓库 4、复制仓库链接 5、打开一个文件夹(想要存储远程仓库的地址)&#xff0c;在…

C# 图解教程 第5版 —— 第24章 预处理指令

文章目录 24.1 什么是预处理指令24.2 基本规则24.3 符号指令&#xff08;#define、#undef &#xff09;24.4 条件编译&#xff08;#if、#else、#elif、#endif&#xff09;24.5 条件编译结构24.6 诊断指令&#xff08;#warning、#error&#xff09;24.7 行号指令&#xff08;#li…

Web后端开发

一、Maven 1.1 简介 1.2 作用 1.3 流程 通过各种插件实现项目的标准化构建。 1.4 安装 1.5 配置环境 1.5.1 当前工程环境 1.5.2 全局环境 1.6 创建 Maven项目 1.7 导入项目 1.8 依赖管理 1.8.1 依赖配置 1.8.2 依赖传递 pom.xml——右键——Diagrams——show dependen…

隧道应用1-netsh端口映射内网

测试环境信息 物理机内网 IP &#xff1a;192.168.249.1 win7 虚拟机 IP &#xff1a; 192.168.249.131 win10 虚拟机 IP &#xff1a;192.168.249.129 我们在 win7 上配置 netsh 端口映射&#xff0c;将 win7 作为跳板机&#xff0c;进而访问到 win10 的服务。 端口映射与…

flutter 打包IOS及常用配置

修改APP名称 项目名字配置是在 ios/Runner/Info.plist 文件中的 dict 下的 CFBundleName testapp 。如下图所示: String里面就可以修改名称 修改项目 &#xff08;testapp&#xff09;的 Logo 图标 iOS 项目 Logo的配置是在 ios/Runner/Assets.xcassets/AppIcon.appiconset 文…

第24集《佛法修学概要》

庚三、不邪淫戒 辛一、解释名义 分五&#xff1a;辛一、解释名义&#xff1b;辛二、具缘成犯&#xff1b;辛三、犯戒轻重&#xff1b;辛四、开缘情况&#xff1b;辛五、持犯得失 请大家打开讲义第六十八页&#xff0c;我们讲到庚三不邪淫戒。这条戒是五戒的第三条。 辛一、解…