可为空引用类型

随着 .NET 6 和 Visual Studio 2022 的发布,我也是把它们升级到最新,开始一探究竟。自己开始着手做一些示例来看看有什么区别,新建一个类库项目,新建类,对引用类型属性就出现一条波浪绿色下划线,鼠标放在属性上会有如下的提示:

图片

根据提示也能快速修改,但是这在之前是没有提示,所以我就去查下。

在 C# 8.0 之前,所有引用类型都可为 null。可为 null 引用类型指 C# 8.0 中引入的一组功能,可用于最大程度地降低代码导致运行时引发 System.NullReferenceException 的可能性。比方说,我们项目中经常会遇到这种情形。

string msg = null;Console.WriteLine(msg.Length);

运行上面的代码,会报

System.NullReferenceException:“Object reference not set to an instance of an object.”一般的处理,我们会加一个 if 进行判断,如下:

string msg = null;if(!string.IsNullOrWhiteSpace(msg))  Console.WriteLine(msg.Length);
//或者Console.WriteLine(msg?.Length);

所以整个项目到处可见的 if ,而一些漏网之鱼且会因开发人员不确定是否为空避开了 if ,结果到正式环境的就起火。

而引入可为空引用类型之后 ,通过vs 开发工具进行预先检查是否可为空,来减少运行时 System.NullReferenceException 次数。而且还能提高代码效率,减少重复的 if。
如果不喜欢这些提示,网上一搜有相应的取消提示方法,微软的文档也有哈。
C# 文档里有详细介绍可为空及不可为空的初始值方法。比如说通过构造函数进行传参赋值。

public class Person{  public int Id { get;set; }  public string Name { get; set; }//不可为空  public string? Address { get; set; } //可为代空    public Person(string name)  {      Name = name;  }}

也给出 defalut 关键字来进行初始化值。

string msg = default!;  //不可为空,不会绿色波浪提示string str = string.Empty;string s = null;  //会有提示
Console.WriteLine(msg);Console.WriteLine(str);Console.WriteLine(s);

运行之后 查看了一下内存分配情况,msg 与 s 是一样,未分配堆内存空间。

&str 

0x000000b484b7eb10     *&str:0x000001f13bf313a0

&msg 

0x000000b484b7eb18*&msg: 0x0000000000000000

&s 

0x000000952557e368 *&s: 0x0000000000000000 上篇,看不明白内存分配,这里作个补充:苏克,公众号:一个有料的码农你了解字符串池?

0x000000b484b7eb10  表示栈的内存地址*&str:0x000001f13bf313a0  表示栈内存空间所存储的值,由于是引用类型,所以需要开辟堆内存来存储 str 因此栈内存存储的是堆内存的地址


参考引用地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/nullable-referenceshttps://devblogs.microsoft.com/dotnet/nullable-reference-types-in-csharp/https://blog.walterlv.com/post/nullable-context-options-warnings.html

最后,祝大家学习愉快!

 2021-12-22 18:04

阅读原文

简介:廉颇老矣,尚能饭否。欢迎关注微信公众号:一个有料的码农
(0)
打赏 喜欢就点个赞支持下吧 喜欢就点个赞支持下吧

声明:本文来自“一个有料的码农”,分享链接:https://www.zyxiao.com/p/310035    侵权投诉

网站客服
网站客服
内容投稿 侵权处理
分享本页
返回顶部