3

我们试图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:这可能不是我们正在尝试解决的最佳解决方案,但现在更多的是好奇为什么它不起作用?它是如何相关的。

4

3 回答 3

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,则此代码将设置mostRecentDateDateTime.MinValue而不是中的最新日期myDates

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

关键是您正在使用的库也可能取决于 on 的值DateTime.MinValue,因此更改它可能会破坏它们。你很幸运,因为你发现这很早就引入了一个错误。如果你不走运,在你的软件上线并且遇到一些极端情况之前,你不会看到问题。

于 2013-01-21T23:39:34.493 回答
1

我最近遇到了类似的问题。
您没有说明为什么要覆盖DateTime.MinValue,但我想原因与我的相似:

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

客户端传递DateTime值,服务器需要检查它们是否传递了“真实”值或DateTime.MinValue.

我的问题是:

  • .NETDateTime.MinValue是今年1月 1 日
  • DateVBA类型的最小可能值是100年 1 月 1 日

DateTime.MinValue⇒当数据来自 MS Access 时,检查不起作用,因为DateAccess 中的变量不能保存像 .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();
于 2016-05-27T20:06:14.157 回答
-1

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

约会时间:

public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
{
    public static readonly DateTime MaxValue
    public static readonly DateTime MinValue
    ....
于 2013-01-21T23:25:05.903 回答