千家信息网

C#可空引用类型怎么使用

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"C#可空引用类型怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#可空引用类型怎么使用"吧!安装您必须下载Visual Stud
千家信息网最后更新 2025年02月01日C#可空引用类型怎么使用

本篇内容主要讲解"C#可空引用类型怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#可空引用类型怎么使用"吧!

安装

您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4)

安装Roslyn扩展预览版本:

  • 下载并解压 Roslyn_Nullable_References_Preview.zip [最新版本 11/15/17];

  • 关闭所有运行的Visual Studio;

  • 运行zip根目录中的 .\install.bat 脚本(如果需要卸载扩展,可以运行.\uninstall.bat脚本);

语法与类型

在语法上,可为空引用类型与可为空值类型使用的语法是一致的,在类型后面追加 ? 即可。

class Person{    public string FirstName;       public string? MiddleName;     public string LastName;}

我们都知道当初微软在增加可为空值类型的时候,实际是在框架中增加了System.Nullable<>类型,您肯定会问,可为空引用类型以框架中又增加了什么新的类型。

我们来看一个演示:

    class Program    {        static void Main(string[] args)        {            Console.WriteLine(typeof(string?).FullName);        }    }

输出结果:

您是否觉得奇怪,怎么输出的是System.String,是的,其实微软在框架中没有加入任何类型,我们Person类型进行编译后,再通过dotPeek进行反编译,就明白到底发生了什么。

反编译后的结果:

    internal class Person    {        public string FirstName;        [Nullable]        public string MiddleName;        public string LastName;    }

只是在MiddleName字段上增加了System.Runtime.CompilerServices.NullableAttribute标记。

我们来看一看属性、参数、变量、返回值编译之前与编译之后的比对结果。

属性

    // 编译前:    public string? MiddleName { get; set; }        // 编译后:    [Nullable]    public string MiddleName { [return: Nullable] get; [param: Nullable] set; }

参数

    // 编译前:    public Person(string? middleName )    {        this.MiddleName = middleName;    }    // 编译后:    public Person([Nullable] string middleName)    {      this.MiddleName = middleName;    }

返回值

    // 编译前:    public string? DoSomething()    {        return null;    }    // 编译后:    [return: Nullable]    public string DoSomething()    {      return (string) null;    }

变量

    // 编译前:    string? name;    // 编译后:    string name;

这里除了变量,其它的都使用了NullableAttribute标记进行的修饰。

它可以做什么?

通过上面的章节,我们知道,可为空引用类型只是在参数、属性、参数和返回值中使用NullableAttribute标记进行修饰,实际上对程序的正常运行没有任何的影响。那么它可以为我们做什么呢?

表达意图

在C#中不能表达这个变量、参数、字段、属性,返回值等可能为null或不能为null,可为空类型可以帮我们解决这个问题。

    class Person    {        public string FirstName;   // 不为null        public string? MiddleName; // 可能为null        public string LastName;    // 不为null    }

这个类型的可以表示每一个人都应该 FristName 和 LastName ,但是不是每一个人都应该有 MiddleName。

编译器检测

可为空引用类型的另一个好处是编译器可以帮助我们检测代码,比如对于直接使用可为空引用类型的属性,编译器会发出警告

    void M(Person p)    {        p.FirstName = null;          // 1 WARNING: Cannot convert null to non-nullable reference。        p.LastName = p.MiddleName;   // 2 WARNING: Possible null reference assignment.        string s = default(string);  // 3 WARNING: Cannot convert null to non-nullable reference。                if (p.MiddleName != null)         {            WriteLine(p.MiddleName.Length); // ok        }                 WriteLine(p.MiddleName!.Length); // ok    }        class Person    {        public string FirstName;     // 4 WARNING: Non-nullable field 'FirstName' is uninitialized.        public string? MiddleName;         public string LastName;      // 5 WARNING: Non-nullable field 'LastName' is uninitialized.    }

编译器会帮我们做以下几点检测:

  • 如果给非可为空引用类型赋null值或可为空引用类型的值,则会发出警告;

  • 如果直接使用可为空引用类型,则会发出警告;

  • 如果从来没有给非可为空引用类型的属性赋值,则会发出警告;

  • 如果需要直接使用可为空引用类型,需要使用 ! 符号告诉编译器,您已经确认过该值不可能为空。

当然这只是编译器的行为,可以禁用与之相关的警告提示。

到此,相信大家对"C#可空引用类型怎么使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

类型 编译 属性 编译器 参数 C# 变量 运行 只是 实际 标记 框架 版本 结果 语法 检测 个人 内容 字段 脚本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 腾讯软件开发阮 多玩诛仙数据库崩了怎么办 网络安全需要哪些条件 有哪些简单的数据库系统 亚马逊主要用哪些服务器好一些 广州自我游网络技术公司 厦门软件开发培训怎么报名学 数据库 tcl nba2k21服务器老是出错怎么办 页面部署到服务器 下面一行乱码 石家庄乐牌网络技术有限公司 常州推广rpa软件开发公司 湖北网络卫星授时服务器云空间 某某公司网络安全解决方案 爱德万的软件开发资料 怎么教数学有什么软件开发 网络安全工作应遵循 网络安全责任观是指 查看权限数据库 承德网络技术发展 中小学网络安全教育文案 厦门网络安全知识竞赛 电脑网络技术很难吗 中国校园服务器地址 录像机日志里提示数据库重建 生物信息数据库如何建立 数据库浏览器手机版 怎么下载微信无法连接到服务器 数据库自反性推理证明 计算机网络技术课后习题及答案
0