覆盖导致问题的DateTime.MinValue

时间:2013-01-21 23:21:54

标签: c# .net wcf datetime

我们试图覆盖应用程序中的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:对于我们正在努力解决的问题,这可能不是最佳解决方案,但现在它更好的是为什么它不能正常工作?它是如何相关的。

3 个答案:

答案 0 :(得分:3)

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

虽然这个相当人为的示例可能不是很好的编程习惯(for example,但您可以使用Nullable),它是有效的代码,如果您更改DateTime.MinValue的值,其行为将会更改。

关键是您使用的库也可能依赖于DateTime.MinValue上的值,因此更改它可能会破坏它们。你发现这很早就引入了一个bug,你很蠢。如果你运气不好,在你的软件上线并且遇到一些角落案件之前你就不会发现问题。

答案 1 :(得分:1)

我最近遇到了类似的问题 您没有告诉为什么要覆盖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一样小的日期&#39 ; s 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();

答案 2 :(得分:-1)

我认为您无法更改DateTime MinValue,因为它是只读的,但如果您可以不要

日期时间:

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