【问题标题】:null-conditional operator for date type?日期类型的空条件运算符?
【发布时间】:2020-07-10 05:06:58
【问题描述】:

在我的模型中,我有这个属性

public DateTime? ReleaseDate { get; set; }

然后,在我的 Blazor razor 页面中,下面的代码有语法错误

<td>@movie.ReleaseDate.ToString("dd-MMM-yyyy")</td>

问题是因为 ReleaseDate 可以为空,但我的问题是如果 ReleaseDate 为空,我如何使用空条件运算符? 获取系统当前日期?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您的代码有语法错误,因为 DateTime 可以为空?没有采用字符串格式参数的ToString() 重载,因此您需要将.Value 从可空值中取出以将可空值转换为正常的日期时间,然后才能对其进行格式化

    要回答您关于 null 条件的具体问题,可以这样:

    (movie.ReleaseDate.HasValue ? movie.ReleaseDate.Value.ToString("dd-MMM-yyyy") : "Not Yet"
    

    Alsein 使用 null 合并的形式比使用 null 条件更具可读性,但他选择说如果电影的发行日期为空,则说今天发行的电影对我来说没有意义。我想说我们需要一种方法,只有当它有一个值时才将其转换为日期字符串,如果它为空,则将其转换为其他字符串。

    考虑:

    movie.ReleaseDate?.ToString("dd-MMM-yyyy") ?? "Not Yet"
    

    如果发布日期为 null,则不会调用 ToString,并且 c# 将直接跳到 ??,结果为 null。 ?? 然后会将 null 转换为“Not Yet”字符串,我认为 null 发布日期可能意味着......

    ? 还可以与 nullable 一起使用,如果它确实有值,则将其变成 DateTime,这就是为什么早期的“DateTime? 没有ToString(string)" 不适用;在评估 movie.ReleaseDate? 时,结果要么是 null 要么是正常的 DateTime,其 ToString 采用格式

    ?? 因此是一种为调用链提供默认值的好方法,其中任何一个调用都可能为空,并且可以通过? 运算符的多次使用来防止抛出空引用:

    notnull.MaybeNull?.MayAlsoBeNull?.Something ?? DefaultThing
    

    还要考虑您是否应该使用这种固定方式为用户设置日期格式,或者使用他们文化的典型日期格式并以不同的格式向不同的网站访问者显示日期是否更有意义

    See something like thisperhaps this 了解如何使您的代码使用用户的语言声明为日期和数字等内容提供特定于文化的格式

    【讨论】:

    • 谢谢。但是当我在 Blazor razor 页面中运行代码时,它显示 02-May-2020 ?? "Not Yet"
    • 您可能需要在@ 之后将整个内容括起来,因为?? "not Yet" 被假定为HTML 标记的一部分而不是代码。您可以通过突出显示什么是代码和什么是 html 的颜色来判断。就像@( x?.Y() ?? "z" ) - 括号帮助 c# 弄清楚什么是代码和什么是页面
    【解决方案2】:

    a ?? b(null-coalescing operator)是a == null ? a : b的缩写,这意味着如果anull,则返回b,否则返回a。

    此运算符要求aT? 类型(Nullable&lt;T&gt;(又名可空值类型)和可空引用类型都被接受)并且bTT? 类型。如果b的类型是T?,那么这个操作符的返回类型也是T?,这意味着??可以被链接。

    a ?? b ?? c ?? d 表示先不为 null 者返回。

    (movie.ReleaseDate ?? DateTime.Now).ToString("dd-MMM-yyyy")
    

    【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2011-02-06
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多