2010-04-30 17 views
7
//always works, returning a valid object into _page 
     _page = _httpContext.Handler as System.Web.UI.Page; 

//Fails throwing the exception : Unable to cast object of type 'System.Web.DefaultHttpHandler' to type 'System.Web.UI.Page' 
     _page = (System.Web.UI.Page)_httpContext.Handler; 

मुझे पता है कि ऐसा क्यों होता चाहते हैं नहीं है क्यों 'के रूप में' कीवर्ड काम करता है?जबकि() डाली

संपादित करें:

   //Fixes the problem 
      if(_httpContext.Handler is System.Web.UI.Page) 
      _page = (System.Web.UI.Page)_httpContext.Handler; 

तो मैं 'के रूप में' कीवर्ड बयान डिबग, मैं कभी नहीं एक अशक्त संदर्भ (वस्तु हमेशा ठीक से सौंपा) मिलता है। हालांकि() कास्ट अपवाद बनाता है जब तक कि उसके पास स्टेटमेंट न हो।

संपादित करें: कक्षा के माध्यम से लगभग 15 रनों के बाद मैं एक शून्य प्राप्त करने में सक्षम था। ऐसा लगता है कि() कास्ट अपवाद को कितनी तेजी से पकड़ने की तुलना में एक नल खोजने के लिए और अधिक रन लेता है।

OLD: जब भी कक्षा 'ब्रेक पॉइंट हिट चलाती है तो' एएस 'कथन पर डीबग होता है - कभी भी शून्य नहीं होता है।

जब tthere में '()' कथन में डीबग होता है, तो हर बार ब्रेक पॉइंट कास्ट सही ढंग से काम करता है। Werid

उत्तर

14

// हमेशा काम करता है, _page _page = _httpContext.Handler System.Web.UI.Page के रूप में एक वैध वस्तु लौटने;

यह तकनीकी रूप से काम नहीं करता था। यदि आप _page देखेंगे null होगा। यह सिर्फ एक त्रुटि फेंक नहीं था।

as ऑपरेटर का उपयोग एप्लिकेशन को बताने के लिए किया जाता है "मैं चाहता हूं कि आप इसे आजमाएं और इसे परिवर्तित करें। ऐसा नहीं हो सकता है, और मुझे यह पता है, इसलिए अपवाद फेंक न दें। मैं इसके अनुसार सौदा करूँगा।"

() रूपांतरण का उपयोग एप्लिकेशन को बताने के लिए किया जाता है, "यह ऑब्जेक्ट इस प्रकार से डाला जाएगा। अगर यह कुछ गलत नहीं है, और मुझे इसके बारे में जानना है।"

दोनों जानवरों (और जब आप उनका उपयोग करना चाहिए) के बीच का अंतर तब होता है जब आप "सोचते हैं" किसी अन्य प्रकार के लिए जाति योग्य होता है और जब आप किसी अन्य प्रकार के लिए कुछ "जान" सकते हैं।

यहाँ इस विषय पर एरिक Lippert द्वारा एक लेख है (अपने ब्लॉग फिर से feeded नहीं करने के लिए बदल): http://blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

0

यदि आप 'as' ऑपरेटर का उपयोग करते हैं, यदि रूपांतरण विफल रहता है, तो यह केवल शून्य हो जाता है। यदि आप एक स्पष्ट कलाकार करते हैं, तो रूपांतरण विफल होने पर यह अपवाद फेंक देगा। इस स्थिति में, अपेक्षित उचित प्रकार के लिए 'as' डाउनकास्ट। स्पष्ट रूपांतरण वांछित प्रकार तक नहीं जा सकता है।

एक सामान्य नियम के रूप में, आपको हमेशा 'as' करना चाहिए जबतक कि आपको वास्तव में स्पष्ट कलाकारों की आवश्यकता नहीं होती है (जैसे कि जब आपको मूल्य प्रकारों में कनवर्ट करने की आवश्यकता होती है)।

+0

मुझे विश्वास नहीं है। मैं कक्षा 1 foo = (class1) बार की बजाय और foo.Property या foo.Method() के साथ बाद में उपयोगी नल अपवाद प्राप्त करने के बजाय कास्ट अपवाद प्राप्त करूंगा। वह शून्य अपवाद आपके "जैसा" के दायरे से बाहर कहीं भी हो सकता है। अगर मैं कोड को कभी-कभी असफल होने की उम्मीद करता हूं, तो मैं "as" का उपयोग करूंगा और शून्य की जांच करूंगा। –

+0

यह सामान्य पैटर्न है। आप 'as' के साथ रूपांतरित करते हैं, और फिर शून्य के लिए जांचें। – Tejs

7

From here:

का उपयोग ऑपरेटर तीन महत्वपूर्ण मायनों में सी # में एक कलाकारों से अलग है के रूप में:

यह NULL भेजता है जब चर आप कन्वर्ट करने के लिए कोशिश कर रहे हैं अनुरोध किया प्रकार की नहीं है या श्रृंखला में अपवाद फेंकने की बजाय इसके उत्तराधिकारी में श्रृंखला। इसे केवल संदर्भ प्रकार चर पर संदर्भ प्रकारों में परिवर्तित किया जा सकता है। उपयोगकर्ता के परिभाषित रूपांतरणों को निष्पादित नहीं करेगा, ऐसे निहित या स्पष्ट रूपांतरण ऑपरेटरों के रूप में, जो सिंटैक्स कास्टिंग करेगा करें। यह नहीं है बस "वाक्यात्मक चीनी" सी # द्वारा लिखित इस अलग व्यवहार प्राप्त करने के लिए - वहाँ वास्तव में दो पूरी तरह से अलग आईएल में परिभाषित संचालन है कि इन दो कीवर्ड ( castclass और isinst निर्देश) संभाल रहे हैं। ऑपरेटर के रूप में प्रतीत होता है थोड़ा तेज v1.0 और कास्टिंग की तुलना में माइक्रोसॉफ्ट के CLR के v1.1 में हो (यहां तक ​​कि ऐसे मामलों में जहां कोई अमान्य डाले हैं जायें जो कि गंभीर रूप से कम कास्टिंग के प्रदर्शन की वजह से अपवाद)।

+0

लेकिन कलाकार क्यों काम नहीं करता है? मुझे पता है कि हैंडलर एक सिस्टम है। वेब.यूआई.पेज। मैंने जो भी पोस्ट किया है उसे भी पढ़ा है और पढ़ा है। अभी भी - कोई मतलब नहीं है। – Mausimo

+0

"इसे केवल संदर्भ प्रकारों में कनवर्ट करने वाले संदर्भ प्रकार चर पर लागू किया जा सकता है" वास्तव में सत्य नहीं है - मान किसी भी प्रकार का हो सकता है, और लक्ष्य प्रकार भी एक शून्य मूल्य प्रकार हो सकता है। तो उदा। '(int) 0 के रूप में IEquatable ' मान्य है, और विशेष रूप से '(ऑब्जेक्ट) ओ int के रूप में?' यह जांचने का एक अच्छा तरीका है कि 'o' अपवाद को पकड़े बिना बॉक्स किए गए 'int' है या नहीं। यह आपको '(टी?) एक्स जैसी चीजें लिखने देता है जैसे कि यू?', जो जेनेरिक कोड में मामूली रूप से उपयोगी हो सकता है। –

+3

@Maus यह वास्तव में काम नहीं करता है। पहली पंक्ति वास्तव में _ null' को _page में रखेगी जो आपको – Earlz

0
बजाय विफलता एक अपवाद फेंकने पर

as की कोशिश करता है का उपयोग करना है कि विशिष्ट प्रकार के उस वस्तु कास्ट करने के लिए है, लेकिन रिटर्न null (कास्टिंग जबकि सिर्फ अपवाद फेंकता है)। क्या आपको यकीन है कि as खंड वाला कोई वास्तव में एक गैर-शून्य वस्तु को वापस कर रहा है?

+0

मैंने एक संपादन किया, मैं एक शून्य खोजने में सक्षम था। – Mausimo

0

@Tejs जवाब कहा एक ही बात है कि। as के साथ एक असफल रूपांतरण शून्य उत्पन्न करता है।

मैं उससे अलग कहने जा रहा हूं हालांकि एक सामान्य नियम के रूप में आपको हमेशा एक स्पष्ट कलाकार का उपयोग करना चाहिए। मैं व्यक्तिगत रूप से एक अपवाद प्राप्त करता था, जहां रूपांतरण किसी अन्य पृष्ठ की बजाय विफल रहता है, कहीं भी शून्य संदर्भ अपवाद से बाहर (प्रतीत होता है) मिलता है।

एक as ऑपरेटर के लिए अच्छा उपयोग यह है जब चीजें एक डेटाबेस से बाहर बदलने और कलाकारों के रूप में के बीच System.DBNull

int someint = cmd.ExecuteScalar() as int? ?? 0; 
4

एक बड़ा अंतर और उपसर्ग कलाकारों के लिए जाँच के लिए इच्छुक नहीं है कि उपसर्ग डाली एक अपवाद फेंक देगा जबकि कलाकार के रूप में सिर्फ शून्य वापस आ जाएगा।

0

जैसा कि कई लोग इंगित कर रहे हैं, as ऑपरेटर इस समस्या में null लौटा रहा है, "समस्या" से परहेज करता है लेकिन वास्तव में "काम नहीं कर रहा"। असल में यह है कि वास्तव में है क्या होने चाहिए था

http://en.csharp-online.net/CSharp_FAQ:_What_is_the_difference_between_using_a_cast_and_the_as_operator

0

,:

इस साइट में as और का उपयोग कर कास्टिंग के बीच 3 मतभेद का अच्छा वर्णन है। कलाकार विफल रहा और फेंक दिया और त्रुटि क्योंकि कास्ट वैध नहीं था। as कास्ट विफल होने पर चुपचाप शून्य हो जाता है।

0

जैसा कि अन्य उत्तरों ने ध्यान दिया है, यह इस तथ्य को उबालता है कि "as" अमान्य कलाकार की स्थिति में शून्य हो जाएगा, जबकि एक स्पष्ट कलाकार अपवाद फेंक देगा।

अन्य उत्तरों के बारे में कुछ बहस है कि क्या एक या दूसरे की ओर झुकना है या नहीं। यदि आप "as" का उपयोग करने जा रहे हैं, तो आपको इस तथ्य के साथ किसी बिंदु पर सौदा करने की आवश्यकता है कि यह शून्य हो सकता है। यदि आप एक स्पष्ट कलाकार का उपयोग करने जा रहे हैं तो आपको एक संभावित अपवाद से निपटना होगा। उपयोग के मामले के आधार पर मैं एक या दूसरे की तरफ झुकता हूं।

मैं विशिष्ट कलाकार का उपयोग करता हूं जब मुझे पता है कि कास्ट काम करेगा लेकिन संकलक नहीं करता है, और अपवाद फेंकना ठीक होगा (क्योंकि यह एक असाधारण मामला है)। लेकिन यदि कोई वैध मौका है कि कास्ट अमान्य हो जाएगा, तो मैं "as" और शून्य के लिए परीक्षण का उपयोग करना पसंद करता हूं। यह अपवाद को पकड़ने से बचाता है जो कठिन है और डीडीगिंग को कठिन आईएमओ बनाता है।