奇思妙想 · 2024年 5月 7日 0

为什么有“可空类型“?

41 次浏览

编程中会遇到这种情况,用整型正数代表数据的值,-1代表错误。程序员必须分清楚这两种情况,避免将-1当做是数据有效值。可空类型正是为了解决这种问题。

  • Swift支持可空类型(类型后面多一个“?”),解决上面的问题。
    var a: Int?

    if let b = a {
        print("Has value") // a有赋值
    } else {
        print("Has no value") // a没有被赋值
    }
  • C/ObjC/C++语法都没有"可空类型"。
  • C#的可空类型是"nullable"类型,可表示一个值可能为空的情况。
    • C# 2.0开始支持基本类型的可空类型,C# 8.0支持引用类型可空类型。
  • Java利用泛型Optional支持可空类型。
  • Kotlin 也在类型后加额外的?表示可空类型。

开启可空类型

  • C#可以用如下三种方式开启可空类型:
    • 代码:#nullable enable (代码所在范围)
    • 工程文件:<Nullable>enable</Nullable> (全局范围)
    • dotnet编译选项: dotnet build /p:Nullable=enable

null值条件运算符

  • C# 6.0引入了此运算符,避免每次判断一个引用是否是null再做解引用。
    例如:int? val = obj?.Length;
  • C# 8.0引入了空合并运算符 ??, "expression1 ?? expression2"表示expression1不为空返回expression1,否则返回expression2.
  • Kotlin 可空类型安全调用的运算符被称为安全调用符,和C#一样用 "?.".

可空类型安全调用默认返回值

有时,尽管一个类型是null, 但不希望安全调用后返回的依然是null.

  • Kotlin 提供了Elvis运算符 ?: 可客制化默认返回null的问题。
    • 例如当name为null,默认返回长度为1:var len = name?.length ?: 1;

非空断言

尽管安全调用可以让null类型更"安全", 有时还是希望碰到null会抛出异常解决不预期的问题。

  • Kotlin 提供非空断言 !!. 强制要求变量不是null, 如果是null会抛出异常。