Question

Dans VB.NET, est-il possible de définir une variable de DateTime à « non défini »? Et pourquoi est-il possible de définir une DateTime à Nothing, mais pas possible de vérifier si elle est Nothing? Par exemple:

Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing 

La deuxième déclaration jette cette erreur:

'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.
Était-ce utile?

La solution

Ceci est l'une des plus grandes sources de confusion avec VB.Net, l'OMI.

Nothing en VB.Net est l'équivalent de default(T) en C #:. La valeur par défaut pour le type donné

  • Pour connaître les types de valeur, cela est essentiellement l'équivalent de 'zéro': 0 pour Integer, False pour Boolean, DateTime.MinValue pour DateTime ...
  • Pour connaître les types de référence, il est la valeur null (une référence qui fait référence à, bien, rien).

La déclaration d Is Nothing est donc équivalente à d Is DateTime.MinValue, qui évidemment ne compile pas.

Solutions: comme d'autres ont dit

  • Soit l'utilisation DateTime? (à savoir Nullable(Of DateTime)). Ceci est ma solution préférée.
  • Ou utilisez d = DateTime.MinValue ou d = Nothing équivalente

Dans le cadre du code d'origine, vous pouvez utiliser:

Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = d.HasValue

Une explication plus complète est disponible sur Anthony D. blog Green

Autres conseils

DateTime est un type de valeur, ce qui explique pourquoi il ne peut pas être nulle. Vous pouvez vérifier pour qu'il soit égal à DateTime.MinValue, ou vous pouvez utiliser Nullable(Of DateTime) à la place.

VB parfois « obligeamment » vous fait penser qu'il fait quelque chose, ce n'est pas. Quand il vous permet de définir une date à rien, il est vraiment mettre une autre valeur, MinValue peut-être.

Voir cette question pour une discussion approfondie sur les types de valeur par rapport à des types de référence.

DateTime est type de valeur , ce qui signifie qu'il a toujours une certaine valeur.

Il est comme un entier - il peut être 0 ou 1, ou inférieur à zéro, mais il ne peut jamais être « rien ».

Si vous voulez un DateTime qui peut prendre la valeur de rien, utilisez un Nullable DateTime.

Quelques exemples sur le travail avec les valeurs nullables de DateTime.

(Voir Nullable Types Valeur ( Visual Basic) pour plus.)

'
' 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]

En outre, sur la façon de vérifier si une variable est null ( Rien (Visual Basic) ):

Lors de la vérification si une référence (ou type de valeur nullable) variable est null , ne pas utiliser = Nothing ou <> Nothing. Utilisez toujours Is Nothing ou IsNot Nothing.

Dans un langage de programmation, faites attention lors de l'utilisation des valeurs NULL. L'exemple ci-dessus montre une autre question. Si vous utilisez un type de Nullable, cela signifie que les variables instanciées de ce type peuvent contenir la valeur System.DBNull.Value; pas qu'il a changé l'interprétation de fixer la valeur par défaut en utilisant « = Nothing » ou que l'objet de la valeur peut désormais prendre en charge une référence null. Juste un avertissement ... heureux de codage!

Vous pouvez créer une catégorie distincte contenant un type de valeur. Un objet créé à partir d'une telle classe serait un type de référence, ce qui pourrait être attribué Rien. Un exemple:

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

End Class

'dans 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

Ensuite, vous pouvez choisir overridables pour lui faire faire ce que vous avez besoin. Beaucoup de travail -. Mais si vous avez vraiment besoin, vous pouvez le faire

Vous pouvez également utiliser ci-dessous tout simple pour vérifier:

If startDate <> Nothing Then
your logic
End If

Il vérifie que la variable startDate de DateTime est nul ou type de données non.

Vous pouvez vérifier cela comme ci-dessous:

if varDate = "#01/01/0001#" then
       '  blank date. do something.
else
       ' Date is not blank. Do some other thing
end if

Une façon de contourner ce serait d'utiliser l'objet à la place datatype:

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

Ensuite, vous pouvez régler la date à rien comme ceci:

MyDate = Nothing
Dim theDate As Date = MyDate
If theDate = Nothing Then
    'date is nothing
End If
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top