覆盖DateTime.MinValue导致问题

本文关键字:问题 MinValue DateTime 覆盖 | 更新日期: 2023-09-27 17:55:07

我们试图覆盖应用程序中的DateTime.MinValue,但是通过这样做,我们注意到我们的Web服务超时了,下面是一个示例代码。不知道出了什么问题/我们错过了什么。

 public MainWindow()
 {
     //Introducing this.. Causes timeout of the webservice call...
     typeof(DateTime).GetField("MinValue").SetValue(typeof(DateTime),new DateTime(1900, 1, 1));
     var yesitworks= DateTime.MinValue;
     InitializeComponent();
     ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
     //Below call will timeout...
     var value =client.GetData(10);
}

PS:这可能不是我们试图解决的最佳解决方案,但现在更多的是好奇为什么它不起作用?

覆盖DateTime.MinValue导致问题

DateTime.MinValue为静态只读字段。这意味着库作者不会期望它改变,并且可能会编写依赖于它具有期望值的代码。

因此,你不应该改变DateTime.MinValue的值

例如,库可以使用它作为变量的默认值:

private mostRecentDate= DateTime.MinValue;
foreach (var date in myDates)
{
    if (date > mostRecentDate)
    {
        mostRecentDate= date;
    }
}
// Do something with the most recent date in myDates...

在这个例子中,如果myDates只包含比DateTime.MinValue的新值更早的日期,那么这段代码将把mostRecentDate设置为DateTime.MinValue,而不是myDates中的最新日期。

虽然这个相当人为的示例可能不是良好的编程实践(例如,您可以使用Nullable代替),但它是有效的代码,如果更改DateTime.MinValue的值,其行为将被改变。

关键是你正在使用的库也可能依赖于DateTime.MinValue的值,所以改变它可能会破坏它们。您很幸运,因为您很早就发现这引入了一个bug。如果你不走运,你不会发现一个问题,直到你的软件已经上线,一些极端情况被击中。

我最近也遇到了类似的问题。
你没有告诉为什么你想要覆盖DateTime.MinValue,但我猜原因和我的相似:

我有一个用。net编写的服务器,它有。net客户端和(通过COM-Interop) MS Access客户端。

客户端传递DateTime值,服务器需要检查他们传递的是"真实"值还是DateTime.MinValue

问题是:

  • 。NET的DateTime.MinValue是一年的1月1日1
  • VBA的Date类型的最小可能值是当年的1月1日100

⇒当数据来自MS Access时,检查DateTime.MinValue不起作用,因为Access中的Date变量不能保存像。net的DateTime.MinValue一样小的日期。

在那一点上,我也试图覆盖DateTime.MinValue,并发现它不起作用。

我的解决方案是为DateTime编写一个扩展方法:

public static class DateTimeExtensions
{
    public static bool MinValue(this DateTime input)
    {
        // check the min values of .NET *and* VBA
        if (input == DateTime.MinValue || input == new DateTime(100, 1, 1))
        {
            return true;
        }
        return false;
    }
}

对于问题中的代码,它需要看起来像这样:

public static class DateTimeExtensions
{
    public static bool MinValue(this DateTime input)
    {
        if (input == new DateTime(1900, 1, 1))
        {
            return true;
        }
        return false;
    }
}

用法:

DateTime theDate = DateTime.Now;
// vanilla .NET
bool isMin1 = (theDate == DateTime.MinValue);
// with the extension method
bool isMin2 = theDate.MinValue();

我不认为你将能够改变DateTime MinValue,因为它是只读的,但如果你可以不要

DateTime:

public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
{
    public static readonly DateTime MaxValue
    public static readonly DateTime MinValue
    ....