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、このコードはの最新の日付ではなくに設定mostRecentDateされます。DateTime.MinValuemyDates

このかなり不自然な例はプログラミングの実践としては適切ではないかもしれませんが(たとえば、代わりにNullableを使用できます)、これは有効なコードであり、の値を変更すると動作が変更されますDateTime.MinValue

重要なのは、使用しているライブラリもの値に依存している可能性があるDateTime.MinValueため、変更するとライブラリが破損する可能性があるということです。これがバグを早期に導入したことを知っている限り、あなたは幸運です。運が悪ければ、ソフトウェアが稼働し、いくつかのコーナーケースが発生するまで問題は発生しません。

于 2013-01-21T23:39:34.493 に答える
1

最近、同様の問題が発生しました。オーバーライドしたい理由
はわかりませんでしたが、理由は私のものと似ていると思います。DateTime.MinValue

.NETで記述されたサーバーがあります。このサーバーには.NETクライアントと(COM-Interop経由で)MSAccessクライアントがあります。

クライアントはDateTime値を渡します。サーバーは、クライアントが「実際の」値を渡したかどうかを確認する必要がありますDateTime.MinValue

私の問題は:

  • .NETDateTime.MinValueは1年目の1月1日です
  • VBAのDateタイプの可能な最小値は、 100年の1月1日です。

DateTime.MinValueデータがMSAccessからのものであるDate場合、Accessの変数は.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 に答える