अगर कोई 'डेटटाइम' 'नथिंग' है तो मैं इसकी जांच क्यों नहीं कर सकता?


81

VB.NET में, क्या DateTime"सेट नहीं" करने के लिए एक चर सेट करने का एक तरीका है ? और क्यों यह संभव एक स्थापित करने के लिए है DateTimeकरने के लिए Nothing, लेकिन नहीं यदि संभव हो तो यह है की जाँच करने के Nothing? उदाहरण के लिए:

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

दूसरा कथन इस त्रुटि को फेंकता है:

'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.

1
नीचे जॉन गैंट के उत्तर के अलावा, आप यह भी जांच सकते हैं कि डेटाटाइम चर = कुछ भी नहीं (नोट "के बजाय" है ")।
DCNYAM

धन्यवाद, बूलियन के रूप में डिम बूलॉटसेट का उपयोग करना = डी = अभी कुछ भी सरल समाधान की तरह नहीं लगता है। Nullable कास्टिंग के साथ दिलचस्प पहले कभी नहीं देखा
Muleskinner

@ क्रिस - मुझे लगता है कि वह वीबी का उपयोग कर रहा है
कार्तिक

@ कार्तिक रत्नम, हां वह है लेकिन यह एक ही बात है और @Marc Gravell का जवाब सभी बिंदुओं पर मिलता है।
क्रिस हास

1
@NYSystemsAnalyst: के अनुसार कुछ भी नहीं है (विजुअल बेसिक) , का उपयोग कर = Nothingया <> Nothing"जब जाँच है कि क्या संदर्भ (या नल मान प्रकार) चर रहा है: नहीं अच्छा अभ्यास है अशक्त , का उपयोग नहीं करते = Nothingया <> Nothingहमेशा इस्तेमाल करते हैं। Is Nothingया IsNot Nothing।"
14

जवाबों:


140

यह VB.Net, IMO के साथ भ्रम के सबसे बड़े स्रोतों में से एक है।

NothingVB.Net default(T)C # में समतुल्य है : दिए गए प्रकार के लिए डिफ़ॉल्ट मान।

  • मूल्य प्रकार के लिए, यह अनिवार्य रूप से 'शून्य' के बराबर है: 0के लिए Integer, Falseके लिए Boolean, DateTime.MinValueके लिए DateTime, ...
  • संदर्भ प्रकारों के लिए, यह 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

एंथनी डी। ग्रीन के ब्लॉग पर अधिक व्यापक स्पष्टीकरण पाया जा सकता है


1
समझाने के लिए धन्यवाद। यह ध्यान रखना दिलचस्प है कि नॉटिंग (डी) काम नहीं करता है लेकिन डी = कुछ भी नहीं करता है!
phn

12

DateTime एक मूल्य प्रकार है, जिसके कारण यह अशक्त नहीं हो सकता है। आप इसके बराबर होने की जांच DateTime.MinValueकर सकते हैं, या Nullable(Of DateTime)इसके बजाय आप इसका उपयोग कर सकते हैं ।

VB कभी-कभी "सहायक रूप से" आपको लगता है कि यह कुछ ऐसा कर रहा है जो यह नहीं है। जब यह आपको कुछ भी नहीं करने के लिए एक तिथि निर्धारित करने देता है, तो यह वास्तव में इसे किसी अन्य मूल्य पर स्थापित कर सकता है, शायद मिनवैल्यू।

मूल्य प्रकार बनाम संदर्भ प्रकारों की व्यापक चर्चा के लिए इस प्रश्न को देखें ।


4

DateTime एक मूल्य प्रकार है , जिसका अर्थ है कि इसका हमेशा कुछ मूल्य होता है।

यह एक पूर्णांक की तरह है - यह 0 या 1 या शून्य से कम हो सकता है, लेकिन यह कभी भी "कुछ भी नहीं" हो सकता है।

यदि आप एक DateTime चाहते हैं जो कुछ भी मूल्य नहीं ले सकता है, तो एक Nullable DateTime का उपयोग करें।


4

अशक्त DateTimeमूल्यों के साथ काम करने पर कुछ उदाहरण ।

(अधिक देखने के लिए अशक्त मान प्रकार (विजुअल बेसिक) देखें ।)

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

यह भी जाँचें कि कैसे एक चर शून्य है ( कुछ भी नहीं (विजुअल बेसिक) )

यह जाँचते समय कि क्या एक संदर्भ (या अशक्त मान प्रकार) चर शून्य है , उपयोग न करें = Nothingया <> Nothing। हमेशा उपयोग Is Nothingया IsNot Nothing

1

किसी भी प्रोग्रामिंग भाषा में, नल का उपयोग करते समय सावधान रहें। ऊपर दिया गया उदाहरण एक और मुद्दा दिखाता है। यदि आप एक प्रकार के Nullable का उपयोग करते हैं, तो इसका मतलब है कि उस प्रकार से त्वरित चर मान System.DBNull.Value का मान रख सकते हैं; ऐसा नहीं है कि यह "= कुछ नहीं" का उपयोग करके डिफ़ॉल्ट को मान सेट करने की व्याख्या को बदल दिया है या मूल्य का उद्देश्य अब एक शून्य संदर्भ का समर्थन कर सकता है। बस एक चेतावनी ... खुश कोडिंग!

आप एक अलग वर्ग बना सकते हैं जिसमें एक मान प्रकार हो। ऐसी कक्षा से बनाई गई एक वस्तु एक संदर्भ प्रकार होगी, जिसे कुछ भी नहीं सौंपा जा सकता है। एक उदाहरण:

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

एंड क्लास

'मेन में ():

        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

तब आप इसे ले सकते हैं और ओवररिएबल्स का चयन कर सकते हैं। काम का बहुत - लेकिन अगर आपको वास्तव में इसकी आवश्यकता है, तो आप इसे कर सकते हैं।


1

आप नीचे दी गई साधारण जांच के लिए भी उपयोग कर सकते हैं:

If startDate <> Nothing Then
your logic
End If

यह जाँच करेगा कि DateTime डेटाटाइप का आरंभिक संस्करण शून्य है या नहीं।


1

आप इसे नीचे की तरह देख सकते हैं:

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

0

इसका एक तरीका इसके बजाय ऑब्जेक्ट डेटाटाइप का उपयोग करना होगा:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.