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