Frage

Ich habe viel gesucht, konnte aber keine Lösung finden. Wie gehen Sie mit einem DateTime- beschäftigen die in der Lage sein sollte, einen nicht initialisierten Wert (äquivalent zu null) enthalten? Ich habe eine Klasse, die einen Datetime Eigenschaftswert gesetzt oder nicht haben könnte. Ich dachte an die Eigenschaft Inhaber zu DateTime.MinValue Initialisierung, die dann leicht überprüft werden konnte. Ich denke, dies ist eine ganz allgemeine Frage ist, wie Sie das tun?

War es hilfreich?

Lösung

Für normale Datetime, wenn Sie sie nicht initialisieren alle dann werden sie DateTime.MinValue übereinstimmen, da es sich um ein Werttyp eher als ein Referenztyp ist.

Sie können auch eine Nullable-Datetime wie folgt verwenden:

DateTime? MyNullableDate;

oder die längere Form:

Nullable<DateTime> MyNullableDate;

Und schließlich gibt es ein in Art und Weise gebaut, um den Standard jeglicher Art zu verweisen. Dies gibt null für Referenztypen, aber für unser Datetime-Beispiel wird es die gleiche wie DateTime.MinValue zurück:

default(DateTime)

Andere Tipps

Wenn Sie .NET 2.0 (oder höher) verwenden, können Sie die Nullable Type verwenden:

DateTime? dt = null;

oder

Nullable<DateTime> dt = null;

dann später:

dt = new DateTime();

Und Sie können den Wert überprüfen:

if (dt.HasValue)
{
  // Do something with dt.Value
}

Oder Sie können es gerne verwenden:

DateTime dt2 = dt ?? DateTime.MinValue;

Mehr erfahren Sie hier lesen:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Datetime? MyDateTime {get; set;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

Weg Folgende Arbeiten als auch

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

Bitte beachten Sie, dass die Eigenschaft Publish sollte Datetime sein?

Ich betrachte würde mit einem Nullable Types .

DateTime? myDate statt DateTime myDate.

Sie können eine Nullable-Klasse verwenden.

DateTime? date = new DateTime?();

Sie können eine NULL festlegbare Datetime für diese.

Nullable<DateTime> myDateTime;

oder die gleiche Sache wie folgt geschrieben:

DateTime? myDateTime;

Ich habe immer die Zeit DateTime.MinValue. Auf diese Weise erhalte ich keine NullErrorException und ich kann es zu einem Datum vergleichen, die ich kenne, ist nicht festgelegt.

Es ist erwähnenswert, dass, während eine DateTime Variable nicht null werden kann, kann es immer noch ohne einen Compiler-Fehler zu null verglichen werden:

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...

Sie können die Datetime Nullable gesetzt. Standardmäßig ist Datetime keine Nullwerte enthalten. Sie können es in ein paar Möglichkeiten machen nullable. Mit einem Fragezeichen nach dem Typ Datetime? myTime oder den generischen Stil Nullable verwenden. Ich habe ein paar Links auf Msdn hinzugefügt.

Mit Nullable

Nullable

Just gewarnt werden - wenn ein Nullable sein offensichtlich nicht mehr ein ‚reines‘ Datetime-Objekt verwenden, als solche nicht die Datetime Mitglieder direkt zugreifen kannst. Ich werde versuchen und erklären.

Mit dem Nullable mit <> Sie grundsätzlich Einwickeln Datetime in einem Behälter (danke Generika), von denen NULL-Werte zulässt - offensichtlich seinen Zweck erfüllt. Dieser Behälter hat seine eigenen Eigenschaften, die Sie, dass der Zugang zu dem oben genannten Datetime-Objekt liefern nennen können; nach der richtigen Immobilie mit - in diesem Fall Nullable.Value - haben Sie dann Zugriff auf die Standard-Datetime-Mitglieder, Eigenschaften etc

.

So - jetzt die Frage kommt in Bezug auf die beste Art und Weise den Sinn des Datetime-Objekt zuzugreifen. Es gibt ein paar Möglichkeiten, die Nummer 1 ist mit Abstand das beste und 2 ist „dude warum“.

  1. Mit der Nullable.Value Eigenschaft,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. Die Umwandlung des Nullable-Objekt in Datetime mit Convert.ToDateTime ()

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

Auch wenn die Antwort auch an dieser Stelle dokumentiert ist, glaube ich, die Verwendung von Nullable wohl wert war über Entsendung. Sorry, wenn Sie nicht einverstanden sind.

bearbeitet. Entfernt eine dritte Option, da es etwas zu spezifisch und Fall abhing

Obwohl jeder, das Sie bereits gegeben hat, die Antwort, werde ich einen Weg nennen, die es einfach macht, einen Datetime in eine Funktion zu übergeben

[ERROR: nicht System.DateTime konvertieren? zu System.DateTime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

Jetzt können Sie dte innerhalb der Funktion ohne Probleme passieren.

Wenn Sie sind, manchmal, erwarten null Sie so etwas wie diese verwenden:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

In Ihrem Repository Verwendung null-able Datetime.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

hatte ich das gleiche Problem wie ich als Parameter für die Datetime Null zu geben, hatte während der Durchführung Unit-Tests für Wirft ArgumentNullException.It in meinem Fall war die folgende Option:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

die Natur eines Datum / Zeit-Datentypen Da es keinen null Wert enthalten kann, das heißt einen Wert enthalten muss, kann es nicht leer sein oder nichts enthalten. Wenn Sie eine Datums- / Zeitvariable als nullable markieren, können nur Sie einen Null-Wert zuweisen. Also, was Sie suchen, ist zu tun, eines von zwei Dingen (es könnte mehr sein, aber ich kann nur an zwei):

  • Vergeben Sie einen Mindest Datum / Zeit-Wert auf Ihre Variable, wenn Sie es keinen Wert haben. Sie können auch einen maximales Datum / Zeit-Wert zuweisen - je nachdem, welche Art und Weise zu Ihnen paßt. So stellen Sie sicher, dass Sie konsistente standortweit sind, wenn Sie das Datum / Zeit-Werte zu überprüfen. Entscheiden über die Verwendung min oder max und bleiben Sie dabei.

  • Markieren Sie Ihr Datums- / Zeitvariablen als nullable. So können Sie Ihre Datums- / Zeitvariablen einstellen können, dass null, wenn Sie nicht eine Variable zu ihm haben.

Lassen Sie mich meinen ersten Punkt zeigen ein Beispiel. Die DateTime Variablentyp kann nicht auf null gesetzt werden, muss es einen Wert, in diesem Fall habe ich es auf den DateTime der Minimalwert gesetzt werde, wenn es keinen Wert.

Mein Szenario ist, dass ich eine BlogPost Klasse. Es hat viele verschiedene Felder / Eigenschaften aber ich wählte nur zwei für dieses Beispiel zu verwenden. DatePublished ist, wenn die Post auf der Website veröffentlicht und hat ein Datum / Zeit-Wert enthalten. DateModified ist, wenn ein Beitrag geändert wird, so dass es keinen Wert enthalten muss, kann aber einen Wert enthalten.

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

ADO.NET Anhand der Daten aus der Datenbank zu erhalten (zuweisen DateTime.MinValue ist kein Wert ist):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

Sie können meinen zweiten Punkt durch Markieren des DateModified Feldes als nullable erreichen. Jetzt können Sie es auf null wenn es keinen Wert für sie ist:

public DateTime? DateModified { get; set; }

ADO.NET Anhand der Daten aus der Datenbank zu bekommen, wird es ein wenig anders als die Art und Weise sehen sie oben (Zuordnung null statt DateTime.MinValue) durchgeführt wurde:

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

Ich hoffe, diese Verwirrung zu klären hilft. Da meine Antwort etwa 8 Jahre später sind Sie wahrscheinlich ein Experte C # Programmierer jetzt:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top