2011-01-20 19 views
16

मैं आम तौर पर सी # में घर पर हूं, और मैं कुछ वीबीएनईटी कोड में एक प्रदर्शन समस्या देख रहा हूं - मैं किसी प्रकार के लिए डिफ़ॉल्ट मान से तुलना करने में सक्षम होना चाहता हूं (जैसे सी # के default कीवर्ड)।वीबी.नेट में सी # के `डिफ़ॉल्ट 'के बराबर क्या है?

public class GenericThing<T1, T2> 
{ 
    public T1 Foo(T2 id) 
    { 
     if(id != default(T2)) // There doesn't appear to be an equivalent in VB.NET for this(?) 
     { 
      // ... 
     } 
    } 
} 

मुझे विश्वास है कि Nothing शब्दार्थ ही था नेतृत्व किया था, फिर भी अगर मैं कार्य करें:

Public Class GenericThing(Of T1, T2) 
    Public Function Foo(id As T2) As T1 
     If id IsNot Nothing Then 
      ' ... 
     End If 
    End Function 
End Class 

फिर जब T2Integer है, और id का मूल्य 0 है, हालत अभी भी गुजरता है, और if का शरीर मूल्यांकन किया जाता है। लेकिन अगर मैं करता हूँ:

Public Function Bar(id As Integer) As T1 
     If id <> Nothing Then 
      ' ... 
     End If 
    End Function 

फिर शर्त पूरी नहीं कर रहा है, और शरीर का मूल्यांकन नहीं किया है ...

+1

संभवतः डुप्लिकेट [सी # के डिफ़ॉल्ट (टी) के लिए वीबी समकक्ष] (http://stackoverflow.com/questions/833791/vb-equivalent-for-cs-defaultt) – decyclone

+2

@decyclone कि प्रश्न सामान्य मामले को कवर नहीं करता है ; और वास्तव में मेरे प्रश्न में मैं दिखाता हूं कि मुझे ज्यादातर मामलों में 'कुछ भी नहीं' का उपयोग करना है ... –

उत्तर

10

यह एक पूर्ण समाधान नहीं है के रूप में अपने मूल सी # कोड संकलन नहीं है। उसी तरह से

Public Class GenericThing(Of T) 
    Public Sub Foo(id As T) 
     Dim defaultValue As T = Nothing 
     If id <> defaultValue Then 
      Console.WriteLine("Not default") 
     Else 
      Console.WriteLine("Default") 
     End If 
    End Function 
End Class 

संकलन नहीं है यही कारण है, कि सी # संस्करण संकलन नहीं करता है - आप ऐसा स्वेच्छापूर्ण प्रकार पैरामीटर के मूल्यों की तुलना नहीं कर सकते हैं: आप एक स्थानीय चर के माध्यम से कुछ भी नहीं कर सकते हैं।

आप उपयोग कर सकते हैं EqualityComparer(Of T) हालांकि - और फिर आप यहां तक ​​कि स्थानीय चर की जरूरत नहीं है:

If Not EqualityComparer(Of T).Default.Equals(id, Nothing) Then 
+0

मुझे लगता है कि मैंने अपने उदाहरणों से थोड़ा अधिक व्यवसाय विशिष्ट शर्तों को लिया है, लेकिन यह * लगता है * मूल्य प्रकारों के लिए काम करने के लिए - क्या आप जानते हैं कि यह संदर्भ प्रकारों के लिए भी कितना अच्छा काम करेगा? –

+0

@ रोवलैंड: जहां तक ​​मुझे पता है, यह ठीक होना चाहिए। –

+0

ठीक है, यह संकलन के रूप में संकलित है, इसलिए मैं जल्द ही निश्चित रूप से जानूंगा; मैं देख सकता हूं कि यह कैसे कंपेलर को जादू करने के लिए मजबूर करेगा और इसे –

19

विपरीत सी #, VB.NET एक स्थानीय चर एक अभिव्यक्ति के साथ प्रारंभ करने के लिए आवश्यकता नहीं है। इसे रनटाइम द्वारा इसके डिफ़ॉल्ट मान में प्रारंभ किया जाता है। बस क्या आप डिफ़ॉल्ट कीवर्ड के लिए एक विकल्प के रूप में की जरूरत है: '? हुह'

Dim def As T2 '' Get the default value for T2 
    If id.Equals(def) Then 
     '' etc... 
    End If 

टिप्पणी भूल जाते हैं, यह किसी को जाने के लिए जा रहा है मत करो अब से एक साल

4

आपके कोड में समस्या IsNot ऑपरेटर है, Nothing कीवर्ड नहीं। docs से:

IsNot ऑपरेटर निर्धारित करता है कि दो ऑब्जेक्ट संदर्भ विभिन्न ऑब्जेक्ट्स को संदर्भित करते हैं या नहीं। हालांकि, यह मूल्य तुलना नहीं करता है।

आप एक संदर्भ ऑपरेटर के साथ मूल्य तुलना करने की कोशिश कर रहे हैं। एक बार जब आप इसे महसूस कर लेंगे, तो जॉन स्कीट या हंस पासेंट के जवाब स्पष्ट समाधान बन जाएंगे।

+0

पर काम करने के लिए सही समझ में आता है - यह हमेशा मुझे परेशान करता है कि वीबी के पास तुलना के लिए '=' और 'Is' दोनों हैं, यह डेवलपर को यह जानने के लिए है कि क्या यह जानना है कि क्या क्रमशः मूल्य या संदर्भ प्रकार की तुलना करने के लिए। –

+0

@ रोवलैंड - सी # में एक "है" ऑपरेटर भी है। मैं अंगूठे के इस नियम का उपयोग करता हूं जो सी # और वीबी दोनों के लिए काम करता है: कंपाइलर शिकायत ==/= का उपयोग करते हैं, और यदि संकलक अभी भी शिकायत करता है तो पहले .quals() का उपयोग करें। –

+0

@ जोएल/रोवलैंड, आदत ने मुझे ऑब्जेक्ट/कक्षाओं के साथ =/== का पक्ष लिया है .. मैं शून्य प्रकारों (ग्रिड?, डेटटाइम ?, आदि) का उपयोग करते समय बराबर का उपयोग करता हूं। मैं बहुत सारे कोड में आया हूं जो गुइड्स के बजाय ग़लतों को अनुचित तरीके से (तारों के रूप में) मानता है? ... यह वास्तव में एसक्यूएल में मुझे और अधिक परेशान करता है जब मुझे उपयोग करना होता है, जहां = null आमतौर पर बोर्क करेगा जो मैं करने की कोशिश कर रहा हूं। – Tracker1

संबंधित मुद्दे