正在检查未初始化的DateTime属性



我有一个类,它有许多属性,其中两个是日期:

public class AchFile
{
public DateTime FileDate { get; set; }
public DateTime EffectiveDate { get; set; }
// other properties
public int Insert()
{
//Set file date
if (FileDate == null)
{
FileDate = DateTime.Today;
}
//Set effective date
if (EffectiveDate == null)
{
EffectiveDate = ServiceUtil.NextBusinessDay(InterfaceId, FileDate);
}

return //....
}
}

当我创建类的实例时,我没有定义EffectiveDateFileDate。如果我调用.Insert(),这会导致一个问题,因为DateTime对象不能是null,因此无法正确访问这些if语句。

更新if语句的最佳方式是什么?

以下内容有意义吗?

// Default value for a DateTime object is MinValue
if (FileDate == FileDate.MinValue)
{
FileDate = DateTime.Today;
}
if (EffectiveDate == EffectiveDate.MinValue)
{
EffectiveDate = ServiceUtil.NextBusinessDay(InterfaceId, FileDate);
}

如果DateTime.MinValue永远不会是这些属性的正常值,您可以对照它进行检查。不过,这感觉有些不愉快,因为它实际上变成了一种神奇的价值。

另一种选择是使属性为null:

public DateTime? FileDate { get; set; }
public DateTime? EffectiveDate { get; set; }

然后,可以根据默认值null检查它们。

请注意,如果您真的只表示日期,那么如果您使用的是.NET6,我建议您使用DateOnly类型来明确这一点。

您可以将DateTime更改为DateTime?,然后它们可以为null,这似乎是您想要的最准确的表示(一个没有值的日期(。

然后你改变:

ServiceUtil.NextBusinessDay(InterfaceId, FileDate);

ServiceUtil.NextBusinessDay(InterfaceId, FileDate.Value);

但是,如果您想避免使用null,那么default(DateTime)(或者在以后的C#版本中仅使用default(就是您想要的。

您可以在创建时初始化属性,而根本不检查:

public class AchFile
{
public DateTime FileDate { get; set; }    
public DateTime EffectiveDate { get; set; } 
public AchFile() { 
...
FileDate = DateTime.Today;
EffectiveDate = ServiceUtil.NextBusinessDay(InterfaceId, FileDate);
...
}
// other properties
public int Insert() {
...

return //....
}
}

如果这不是一条出路(比如说,你今天可以创建ArchFile,但明天开始使用它(,那么你必须保留DateTime,而不是DateTime?您可以为属性指定某种默认值

public class AchFile
{
// 1 Jan 1 as a default value 
public DateTime FileDate { get; set; }      = DateTime.MinValue;
public DateTime EffectiveDate { get; set; } = DateTime.MinValue;
// other properties
public int Insert()
{
//Set file date
if (FileDate == DateTime.MinValue)
{
FileDate = DateTime.Today;
}
//Set effective date
if (EffectiveDate == DateTime.MinValue)
{
EffectiveDate = ServiceUtil.NextBusinessDay(InterfaceId, FileDate);
}

return //....
}
}

最新更新