c# - 有没有办法访问 Nullable.Value 不执行 Nullable.HasValue 检查?
问题描述
我有一些可以为空的值,并且希望在访问它们的值时避免异常。以下显示了我想要实现的示例。我目前有
DateTime? dt = null;
if(dt != null)
{
Console.WriteLine(dt?.ToString("yyyyMMddHHmmss"));
}
但我已经看到可空值有一个Value
属性。等价的将是
DateTime? dt = null;
if(dt.HasValue)
{
Console.WriteLine(dt.Value.ToString("yyyyMMddHHmmss"));
}
有没有办法可以将代码简化为这样的东西?
DateTime? dt = null;
Console.WriteLine(dt.Value?.ToString("yyyyMMddHHmmss"));
以便它仅在.ToString("yyyyMMddHHmmss")
不dt
为空时运行?
解决方案
使用模式匹配(自 c# 7.0 起),您可以编写
DateTime? dt = null;
if (dt is DateTime d) {
Console.WriteLine(d.ToString("yyyyMMddHHmmss"));
} else {
Console.WriteLine("dt is null");
}
这种类型模式有效,因为null
没有类型并且null is T
总是返回false
。如果该值不为 null,则将其强制转换T
并分配给d
type的新变量T
。
您还可以使用空属性模式(空,因为我们不想测试属性)。为了使属性模式为真,假定一个非空对象。因此,这测试not null
.
if (dt is {} d) {
// d is a non-nullable DateTime and of course dt was not null here.
}
但我必须承认,这不太可读。
也可以看看:
您还可以使用字符串插值,如果不仅仅是日期,这将特别有用。这样做的好处是您不需要测试是否dt
为 null,因为您没有调用ToString
:
Console.WriteLine($"Date: {dt:yyyyMMddHHmmss}");
推荐阅读
- java - Cucumber - 如何构建你的测试步骤?
- c# - 如何实现全局 WinAPI 覆盖接口
- html - 使用 Doxygen 内联显示图像
- visual-studio-code - 当窗格中的最后一个文件关闭时,防止 Visual Studio Code 更改窗口布局?
- php - php,如何作为类连接数据库,发送sql语句并返回结果
- node.js - 如何用 Sequelize 建立两个不直接相互依赖的表之间的关系?
- react-native - 如何在尴尬的 createStackNavigator 屏幕上居中标题文本?
- java - 为什么我的arraylist 只填充了一个元素?
- javascript - 使用 map 和 reduce 转换数组
- excel - 如果某个值在一列的每 10 个单元格中出现少于 3 次,则将这些值替换为另一个值