Ich lese ein .NET-Buch und in einem der Codebeispiele gibt es eine Klassendefinition mit diesem Feld:
private DateTime? startdate
Was heißt DateTime?
das
Antworten:
Da DateTime
a struct
, nicht a ist class
, erhalten Sie ein DateTime
Objekt , keine Referenz , wenn Sie ein Feld oder eine Variable dieses Typs deklarieren.
Und genau wie ein int
kann nicht sein null
, so kann dieses DateTime
Objekt niemals sein null
, weil es keine Referenz ist.
Durch Hinzufügen des Fragezeichens wird es zu einem nullbaren Typ , was bedeutet, dass es entweder ein DateTime
Objekt ist oder es ist null
.
DateTime?
ist syntaktischer Zucker für Nullable<DateTime>
, wo Nullable
ist selbst ein struct
.
Es ist eine nullbare DateTime. ?
Nach einem primitiven Typ / einer primitiven Struktur wird angezeigt, dass es sich um die nullfähige Version handelt.
DateTime ist eine Struktur, die niemals null sein kann. Von MSDN :
Der Werttyp DateTime repräsentiert Datums- und Uhrzeitangaben mit Werten zwischen 12:00:00 Uhr Mitternacht, 1. Januar 0001 Anno Domini oder AD (auch als Common Era oder CE bekannt) und 23:59:59 Uhr, 31. Dezember 9999 AD (CE)
DateTime?
kann jedoch null sein.
A ? Als Suffix für einen Werttyp sind Nullzuweisungen zulässig, die andernfalls unmöglich wären.
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
Stellt ein Objekt dar, dessen zugrunde liegender Typ ein Werttyp ist, dem auch eine Nullreferenz zugewiesen werden kann.
Dies bedeutet, dass Sie so etwas schreiben können:
DateTime? a = null;
if (!a.HasValue)
{
a = DateTime.Now;
if (a.HasValue)
{
Console.WriteLine(a.Value);
}
}
Terminzeit? ist syntaktisch äquivalent zu Nullable <DateTime> .
Dies entspricht Nullable <DateTime>. Sie können "?" zu jedem primitiven Typ oder Struktur.
Es gibt Ihnen im Grunde einen zusätzlichen Zustand für Grundelemente. Es kann ein Wert sein oder es kann null sein. Dies kann in Situationen nützlich sein, in denen kein Wert zugewiesen werden muss. Anstatt beispielsweise datetime.min oder max zu verwenden, können Sie es null zuweisen, um keinen Wert darzustellen.
Wie wir wissen, ist DateTime eine Struktur, dh DateTime ist ein Werttyp. Sie erhalten also ein DateTime-Objekt, keine Referenz, da DateTime keine Klasse ist. Wenn Sie ein Feld oder eine Variable dieses Typs deklarieren, können Sie nicht mit null initialisieren, weil Werttypen akzeptiere nicht null. Genauso wie ein int nicht null sein kann. Daher ist das DateTime-Objekt niemals null, da es keine Referenz ist.
Aber manchmal brauchen wir eine nullbare Variable oder ein Feld von Werttypen. Dieses Mal verwenden wir ein Fragezeichen, um sie zum nullbaren Typ zu machen, damit sie null zulassen.
Zum Beispiel:-
Terminzeit? Datum = null;
int? intvalue = null;
Im obigen Code ist das variable Datum ein Objekt von DateTime oder es ist null. Gleiches gilt für intvalue.
public class ReportsMapper : CommonMapper
{
public DateTime? cb_Bill_From_Date { get; set; }
public DateTime? cb_Bill_To_Date { get; set; }
public DateTime? tff_Bill_From_Date { get; set; }
public DateTime? tff_Bill_To_Date { get; set; }
}
Wenn Sie DateTime in der Prozedur als Null deklarieren, wird eine Fehlermeldung angezeigt, dass das DateTime-Objekt niemals Null sein kann. Sie müssen also hinzufügen? Nach DateTime heißt das, dass DateTime ebenfalls nullbar ist.
Ich hoffe das hilft!