我是C#的新手。我可以在下面使用您的帮助。我有以下代码。
private void foo(TropicalRequest tropicalRequest)
{
var buildRequest = new RestRequest()
{
BaseUrl = tropicalRequest.baseUrl,
StatusCode = tropicalRequest.statusCode,
InitialDate = tropicalRequest.createdDate.Value
};
//Code call to save into DB
}
"tropicalRequest.createdDate.Value"字段不包含每个场景的值,当它为空时,我的代码会中断。我已经编写了下面的代码,但我想优化它,非常感谢您的帮助。
private void foo(TropicalRequest tropicalRequest)
{
var buildRequest = new RestRequest()
{
BaseUrl = tropicalRequest.baseUrl,
StatusCode = tropicalRequest.statusCode
};
if(tropicalRequest.createdDate.HasValue)
buildRequest.InitialDate = tropicalRequest.CreatedDate.Value;
//Code call to save into DB
}
基本上,我想仅在值不为 null 时才将值设置为对象内的字段。
编辑#1:InitialDate和CreatedDate都是数据类型DateTimeOffset。
编辑#2:InitialDate不可为空,CreatedDate可为空的DateTimeOffset。
您可以使用空传播运算符:
var buildRequest = new RestRequest()
{
BaseUrl = tropicalRequest.baseUrl,
StatusCode = tropicalRequest.statusCode,
InitialDate = tropicalRequest.createdDate ?? default(DateTimeOffset)
};
编译器已经对其进行了优化。如果您只想以不同的方式设置代码格式,则可以使用此语法。因此,如果有值,将使用 CreatedDate,否则将使用 ??语法,在本例中为 default(DateTimeOffset),这与未分配相同。因此,有人可能会争辩说您当前的语法实际上比这"更好"。
private void foo(TropicalRequest tropicalRequest)
{
var buildRequest = new RestRequest()
{
BaseUrl = tropicalRequest.baseUrl,
StatusCode = tropicalRequest.statusCode,
InitialDate = tropicalRequest.CreatedDate ?? default(DateTimeOffset);
};
}
由于您的 InitialDate 是非空的 DateTimeOffset 它,即使您没有分配它,它也将始终初始化为 DateTimeOffset 的默认值。
一个重要的注意事项,DateTime 对象的默认值是它的MinValue
这意味着如果您没有分配任何内容,则意味着其值将01/01/0001 00:00:00
。考虑第二个示例中null
tropicalRequest.CreatedDate
,则buildRequest.InitialDate
将是最小值。
如果您希望它
null
意味着它应该是Nullable
类型。 可以使用以下语法来定义它们。DateTime? InitialDate;
如果你在类中这样声明,那么你不需要检查HasValue
属性。 你可以像这样直接分配InitialDate = tropicalRequest.createdDate
正如另一个答案所述,如果您使用的是 Null 条件运算符运算符,则可以尝试 c# 6.0
. 否则 使用条件运算符:
var buildRequest = new RestRequest()
{
BaseUrl = tropicalRequest.baseUrl,
StatusCode = tropicalRequest.statusCode,
InitialDate = tropicalRequest.createdDate.HasValue ? tropicalRequest.CreatedDate.Value : DateTime.MinValue;
};