提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:陈津勇|2019-10-29 12:01:11.807|阅读 226 次
概述:本文详细介绍了空引用异常会出现的情况、启用C#8.0消除空引用异常的方法。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
在数十年的编程中,NullReferenceException困扰着我们。尽管此异常很容易解决,但在其他地方发生此异常的可能性很高。
随着C#8.0中可空值的引入,空引用异常出现的概率变得最小。本文,小编将指导您在C#程序中使用nullable以避免Null Reference Exception。(注意:本教程需使用Visual Studio 2019版本16.3或更高版本)
空引用异常的场景
首先让我们看一下发生空引用异常的情况。考虑下面这个名为Commit的类,其中包含数据、用户名、密码和提交消息,以及仅初始化名字和姓氏值的构造函数。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">班级提交</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 公用字符串UserName {get; </font><font style="vertical-align: inherit;">组; </font><font style="vertical-align: inherit;">}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 公共字符串密码{get; </font><font style="vertical-align: inherit;">组; </font><font style="vertical-align: inherit;">}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 公共字符串CommitMessage {get; </font><font style="vertical-align: inherit;">组; </font><font style="vertical-align: inherit;">}</font></font><font></font> <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 公共提交(字符串用户名,字符串密码)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> UserName =用户名;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 密码=密码;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font><font></font>
如果使用构造函数创建Commit类的实例,并尝试获取CommitMessage的长度,则最终将导致null引用异常。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">静态void Main(string [] args)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 提交初始=新的Commit(“ Suresh”,“ $ trongPassword123”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> int messageLength = GetMessageLength(initial);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> Console.WriteLine(messageLength);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font><font></font> <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> static int GetMessageLength(公共人员)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> var commitMessage = person.CommitMessage;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回commitMessage.Length;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font><font></font>
一旦发现这段代码将导致null引用异常,就可以通过给它一个null检查来修复它。
借助可为空的功能,即使在编译代码之前,也可以识别异常的发生。具体操作方法请往下看。
如何启用C#8.0
可为空的功能是C#8.0更新的一部分,您必须先确认您的项目已使用C#8.0编码,然后才能继续进行。
在最新版本的Visual Studio中,禁止在项目属性中更改语言版本的规定。
在进一步检查提供的链接时,我们发现,当项目的目标框架是.NET Core 3.x或.NET Standard 2.1时,默认语言版本是C#8.0。
如果您在项目中使用较旧的框架,但仍想尝试此功能,则可以手动配置。编辑项目文件(* .csproj),并将语言版本标签的值(<LangVersion>)编辑为预览,如下所示。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><PropertyGroup></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <LangVersion>预览</ LangVersion></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> </ PropertyGroup></font></font><font></font>
这将允许您使用编译器支持的预览c#语言中可用的特性。
使用可空的特性
现在,为整个项目启用可空特性(也可以为特定类启用它)。编辑项目文件,并使用enable值添加可空标记。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <PropertyGroup></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <OutputType> Exe </ OutputType></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <TargetFramework> netcoreapp3.0 </ TargetFramework></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <Nullable>启用</ Nullable></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> </ PropertyGroup></font></font><font></font>
这将导致Commit类的构造函数中出现警告,提示该CommitMessage未初始化。
避免警告和只担心错误是普通开发人员的天性。在这里,我们不能忽略这个警告,因为它会在运行时导致异常。因此,使用null值初始化CommitMessage。
仍然会显示警告。现在,通过将其声明为可为空的字符串(string?),使CommitMessage属性接受null。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">公共字符串?</font><font style="vertical-align: inherit;">CommitMessage {get; </font><font style="vertical-align: inherit;">组; </font><font style="vertical-align: inherit;">} </font></font>
尝试访问CommitMessage的长度时,警告将消失,并且新警告将显示在Program.cs类中。
如果CommitMessage为null ,则返回0处理该警告。现在,该程序不再有可能出现空引用异常。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">static int GetMessageLength(公共人员)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> var commitMessage = person.CommitMessage;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果(commitMessage为null)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回0;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回commitMessage.Length;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font><font></font>
您可以在点击此处下载该项目的副本。
关注“慧聚IT”微信公众号,及时获取产品最新消息和最新资讯
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
适用于.NET、C++、Python和前端开发人员的最佳综合 IDE
Essential Studio Enterprise Edition企业级界面开发工具包,包含800多个.NET和JavaScript平台的组件和框架。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢