VB.NETでは、DateTime
変数を「設定しない」に設定する方法はありますか?そして、なぜDateTime
をNothing
に設定することが可能ですが、notがNothing
であるかどうかを確認することは可能ですか?例えば:
Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing
2番目のステートメントはこのエラーをスローします。
'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.
これは、VB.Net、IMOとの最大の混乱の原因の1つです。
VB.NetのNothing
は、C#のdefault(T)
と同等です:指定された型のデフォルト値。
Integer
の場合は0
、False
の場合はBoolean
、DateTime
の場合はDateTime.MinValue
、.null
値(何も参照しない参照)です。したがって、ステートメントd Is Nothing
はd Is DateTime.MinValue
と同等であり、明らかにコンパイルされません。
ソリューション:他の人が言ったように
DateTime?
(つまり、Nullable(Of DateTime)
)を使用します。これは私の好みのソリューションです。d = DateTime.MinValue
または同等のd = Nothing
を使用します元のコードのコンテキストでは、次を使用できます。
Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = d.HasValue
より包括的な説明は Anthony D. Greenのブログ にあります。
DateTimeは値型であるため、nullにすることはできません。 _DateTime.MinValue
_と等しいかどうかを確認するか、代わりにNullable(Of DateTime)
を使用できます。
VBは、「役立つ」ことで、そうではないことをしていると思わせることがあります。 DateをNothingに設定できる場合、実際には他の値、おそらくMinValueに設定されます。
値型と参照型の詳細な説明については、 この質問 を参照してください。
DateTimeはvalue typeです。つまり、常に何らかの値があります。
これは整数のようなものです。0、1、またはゼロ未満にすることができますが、「何もない」ことはありません。
値Nothingを取ることができるDateTimeが必要な場合は、Nullable DateTimeを使用します。
Nullを許可するDateTime
値の使用例。
(詳細については Nullable Value Types(Visual Basic) を参照してください。)
'
' An ordinary DateTime declaration. It is *not* nullable. Setting it to
' 'Nothing' actually results in a non-null value.
'
Dim d1 As DateTime = Nothing
Console.WriteLine(String.Format("d1 = [{0}]\n", d1))
' Output: d1 = [1/1/0001 12:00:00 AM]
' Console.WriteLine(String.Format("d1 is Nothing? [{0}]\n", (d1 Is Nothing)))
'
' Compilation error on above expression '(d1 Is Nothing)':
'
' 'Is' operator does not accept operands of type 'Date'.
' Operands must be reference or nullable types.
'
' Three different but equivalent ways to declare a DateTime
' nullable:
'
Dim d2? As DateTime = Nothing
Console.WriteLine(String.Format("d2 = [{0}][{1}]\n", d2, (d2 Is Nothing)))
' Output: d2 = [][True]
Dim d3 As DateTime? = Nothing
Console.WriteLine(String.Format("d3 = [{0}][{1}]\n", d3, (d3 Is Nothing)))
' Output: d3 = [][True]
Dim d4 As Nullable(Of DateTime) = Nothing
Console.WriteLine(String.Format("d4 = [{0}][{1}]\n", d4, (d4 Is Nothing)))
' Output: d4 = [][True]
また、変数がnullかどうかを確認する方法について(from Nothing(Visual Basic) ):
参照(またはNULL入力可能な値型)変数がnullであるかどうかを確認するときは、= Nothing
または<> Nothing
を使用しないでください。常にIs Nothing
またはIsNot Nothing
を使用してください。
これは次のように確認できます。
if varDate = "#01/01/0001#" then
' blank date. do something.
else
' Date is not blank. Do some other thing
end if
以下を使用して、簡単に確認することもできます。
If startDate <> Nothing Then
your logic
End If
DateTimeデータ型のstartDate変数がnullかどうかを確認します。
どのプログラミング言語でも、Nullを使用する場合は注意してください。上記の例は別の問題を示しています。 Nullableの型を使用する場合、その型からインスタンス化された変数は値System.DBNull.Valueを保持できることを意味します。 「= Nothing」を使用して値をデフォルトに設定する解釈が変更されたことや、値のオブジェクトがnull参照をサポートできるようになったことではありません。ただの警告...幸せなコーディング!
値型を含む別のクラスを作成できます。そのようなクラスから作成されたオブジェクトは参照型になり、Nothingを割り当てることができます。例:
Public Class DateTimeNullable
Private _value As DateTime
'properties
Public Property Value() As DateTime
Get
Return _value
End Get
Set(ByVal value As DateTime)
_value = value
End Set
End Property
'constructors
Public Sub New()
Value = DateTime.MinValue
End Sub
Public Sub New(ByVal dt As DateTime)
Value = dt
End Sub
'overridables
Public Overrides Function ToString() As String
Return Value.ToString()
End Function
終了クラス
'Main():
Dim dtn As DateTimeNullable = Nothing
Dim strTest1 As String = "Falied"
Dim strTest2 As String = "Failed"
If dtn Is Nothing Then strTest1 = "Succeeded"
dtn = New DateTimeNullable(DateTime.Now)
If dtn Is Nothing Then strTest2 = "Succeeded"
Console.WriteLine("test1: " & strTest1)
Console.WriteLine("test2: " & strTest2)
Console.WriteLine(".ToString() = " & dtn.ToString())
Console.WriteLine(".Value.ToString() = " & dtn.Value.ToString())
Console.ReadKey()
' Output:
'test1: Succeeded()
'test2: Failed()
'.ToString() = 4/10/2012 11:28:10 AM
'.Value.ToString() = 4/10/2012 11:28:10 AM
次に、オーバーライド可能なものを選択して選択し、必要な処理を実行できます。多くの作業-しかし、本当に必要な場合は、それを行うことができます。
これを回避する方法は、代わりにObjectデータ型を使用することです。
Private _myDate As Object
Private Property MyDate As Date
Get
If IsNothing(_myDate) Then Return Nothing
Return CDate(_myDate)
End Get
Set(value As Date)
If date = Nothing Then
_myDate = Nothing
Return
End If
_myDate = value
End Set
End Property
その後、日付を次のようなものに設定することはできません。
MyDate = Nothing
Dim theDate As Date = MyDate
If theDate = Nothing Then
'date is nothing
End If