栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是空的!声明是什么意思?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是空的!声明是什么意思?

了解

null!
含义的关键是了解
!
操作员。您之前可能已将其用作“非”运算符。但是从C#8.0开始,该运算符还可以用于控制Nullabilty的类型

!
在类型上使用什么运算符?

!
运算符用于某种类型时,称为Null宽容运算符 [ docs ]。它是在C#8.0中引入的


技术说明

典型用法

假设此定义:

class Person{  public string? MiddleName;}

用法是:

void LogPerson(Person person){    Console.WriteLine(person.MiddleName.Length);  // WARNING: may be null    Console.WriteLine(person.MiddleName!.Length); // No warning}

此运算符基本上关闭编译器的空检查。

内部运作

使用此运算符告诉编译器可以安全地访问某些可能为空的内容。您表示打算在这种情况下“不关心”空安全性。

谈论null安全性时,变量可以处于2种状态。

  • 可空- 可以 为空。
  • 不可为空- 不能 为空。

从C#8.0开始,默认情况下所有引用类型都是不可为空的。

可以通过以下两个新的类型操作符来修改“可空性”:

  • !
    =从
    Nullable
    Non-Nullable
  • ?
    =从
    Non-Nullable
    Nullable

这些运算符基本上是彼此对应的。编译器使用您使用这些运算符定义的信息来确保空安全性。

?
操作员用法。

  1. 可空

    string? x;

    • x
      是引用类型-因此默认情况下不可为null。
    • 我们应用
      ?
      运算符-使它可以为空。
    • x = null
      工作良好。
    • 不可为空

      string y;

    • y
      是引用类型-因此默认情况下不可为null。

    • y = null
      由于将空值分配给不应为空的值,因此会生成警告。

!
操作员用法。

string x;string? y = null;
  1. x = y

    • 非法!--
      Warning: "y" may be null
    • 分配的左侧为不可为空,而右侧则为可为空。
    • x = y!

    • 法律!

    • 分配的左侧和右侧不可为空。
    • 自从
      y!
      !
      运算符应用于
      y
      使其不可为空的运算符以来,一直有效。

警告

!
操作者仅关闭在一个类型的系统级的编译器检查-在运行时,仍然值可以为空。

这是一个反模式。

你应该 尝试避免 使用

!
空赦的运营商。

在此操作员适合使用的情况下,存在有效的用例(在下面详细介绍),例如单元测试。但是,在99%的情况下,使用替代解决方案会更好。请不要

!
在您的代码中拍打几十个,只是为了使警告静音。考虑一下您的原因是否真的值得使用。

使用-但要小心。如果没有具体目的/用例,请不要使用它。

它抵消了编译器保证的空安全性的影响。

使用

!
运算符将很难发现错误。如果您有一个标记为不可为空的属性,则将假定您可以安全地使用它。但是在运行时,您突然碰到a
NullReferenceException
并挠头。由于在绕过带有的编译器检查之后,值实际上变为null
!

那么为什么这个运算符存在?

  • 在某些情况下,编译器无法检测到可为空的值实际上是不可为空的。
  • 遗留代码库迁移更容易。
  • 在某些情况下,您根本不在乎某些东西是否为空。
  • 使用单元测试时,您可能需要检查
    null
    通过时的代码行为。

具体回答您的问题。

那是什么
null!
意思呢?

它告诉编译器这

null
不是一个
null
值。听起来很奇怪,不是吗?

y!
上面的示例相同。 因为您将运算符应用于
null
文字,所以它看起来很奇怪
。但是概念是相同的。

整理正在发生的事情。

public string LastName { get; } = null!;

该行定义了一个名为

LastName
type 的不可为空的类属性
string
。由于它是不可为空的,因此从技术上讲,您不能为它分配null-显然。

但是,您只需要使用运算符就可以做到这一点-分配

null
LastName
-
!
。因为
null!
不是null-
就编译器所关心的null安全而言。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/421422.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号