覆盖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
的值
例如,库可以使用它作为变量的默认值:
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
....