代码之家  ›  专栏  ›  技术社区  ›  Pikachu620

可空结构

  •  0
  • Pikachu620  · 技术社区  · 7 年前

    我读 Nullable Structure 并且理解其中的大部分。但我不知道人们何时以及为什么会使用它。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Hossein Golshani    7 年前

    用法 Nullable<T> 宽阔。例如,假设您有一个查询,该查询返回博客上特定用户的最后一篇文章的id:

    int lastId = User.GetLastPostId();
    

    如果用户还没有任何post,则该方法返回null并导致异常。解决方案是使用 Nullable<int> 而不是 int 以避免错误。

    int? lastId = User.GetLastPostId();
    

    在这种情况下,您甚至可以检查是否为空:

    if(lastId == null)
        // do something
    else
        // do something
    

    类似于上面的内容,假设您希望在代码中使用struct而不是类。只要结构是valuetype,它就不能接受空值,如果要强制结构接受空值,则应将其定义为可为空。

    Struct Person
    {
        public string Name;
    }
    
    Person p = null; // Error
    Person? p = null; // Correct
    
        2
  •  5
  •   LeopardSkinPillBoxHat    7 年前

    C的概念是 参考 类型(类)和 价值 类型(结构和内置类型,如 int , bool , DateTime 等)。

    引用类型可以有 null 值,表示它们尚未被分配(或它们没有值)。

    值类型最初没有可为空值的概念。它们在某些上下文中有一个默认值(例如 int 类中的字段的默认值为0)。但他们没有“没有”价值的概念。

    进入 Nullable<T> .

    可为空<t> (或其速记符号 T? )指示可能有或可能没有值的值类型。

    例如

    int? foo = null; // No initial value
    foo = 9; // Now it has a value
    foo = null; // No value again
    

    还有一些方法可以查询该值是否存在并检索它:

    if (foo.HasValue)
    {
        int actualValue = foo.Value;
    }
    

    在编写连接到数据库的代码时,这一点非常有用。许多数据库中的数值(整数)列可以配置为可为空。如果c本身没有可为空的类型,则需要跳过环来处理代码中的空db值(例如,使用特殊的sentinel值来表示空db值)。可为空的类型使此操作更加无缝。