2009-02-20 15 views
7

मुझे लगता है कि का उपयोग कर निम्न:क्या सी # कीवर्ड "एएस" का उपयोग करके उपरोक्त कारण हैं?

TreeViewItem i = sender as TreeViewItem; 
if(i != null){ ... } 

आसान है लिखने और समझने से रहे हैं:

if(sender.GetType() == typeof(TreeViewItem)){ 
    TreeViewItem i = (TreeViewItem)sender; 
    ... 
} 

वहाँ बाध्यकारी कारण नहीं पहले निर्माण का उपयोग करने के हैं?

+0

sender.GetType() == typeof (TreeViewItem) नहीं 'TreeViewItem के रूप में इस' के रूप में एक ही बात है। यही कारण है कि परीक्षण 'के रूप में' और 'है' कीवर्ड करता है, कुछ खाते में वंशानुगत पदानुक्रम लेने के लिए विफल रहता है। –

+0

डुपे? http://stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr/496167#496167 –

उत्तर

12

मैं ज्यादातर मामलों में as पर रोकता हूं क्योंकि आम तौर पर यदि वस्तु का प्रकार गलत है, तो यह एक बग इंगित करता है। बग कारण अपवाद आईएमओ - और InvalidCastException कास्ट करने वाली रेखा पर बिल्कुल सही है, जो कोड में बहुत बाद में NullReferenceException से बहुत स्पष्ट है।

as का उपयोग तब किया जाना चाहिए जब यह वैध और कानूनी प्रकार के किसी ऑब्जेक्ट का संदर्भ पारित किया गया हो जिसे आप नहीं चाहते हैं। वह स्थिति आती है, लेकिन मेरे अनुभव में सामान्य रूप से सामान्य कास्टिंग नहीं होती है।

तुलना GetType() का उपयोग कर प्रकार, हालांकि, बहुत मुश्किल से ही सही समाधान है - यह केवल उचित है जब आप सटीक एक संगत प्रकार के बजाय शामिल प्रकार के लिए जाँच करना चाहते हैं।

मैंने कहीं और "कास्ट बनाम" चर्चा के बारे में significantly longer answer लिखा है।

7

बिलकुल नहीं - यह आपको यह सत्यापित करने का मौका देता है कि रूपांतरण (कास्ट) ठीक किया गया था। यदि आप

TreeViewItem i = (TreeViewItem) sender; 

कास्ट विफल होने पर आपको अपवाद मिल सकता है।

4

"as": अच्छी चीजें। यह हर समय उपयोग करें।

यदि आप वास्तव में एक विकल्प के लिए मैन्युअल रूप से की तुलना करना चाहते हैं प्रकार की कोशिश:

if(person is Employee) { } 

अभी तक बेहतर पढ़ता है।

1

तेजी से होता है, लेकिन चीजों को ध्यान में रखना है "के रूप में":

  • एक अशक्त रिटर्न के बजाय एक अपवाद फेंक है कि अगर एक समस्या

  • ऐसा नहीं होगा की "के रूप में" कस्टम रूपांतरण iirc

  • यह reference- लिए काम नहीं करता> मूल्य

संपादित करें: "के रूप में" निश्चित रूप से तेजी से (http://www.codeproject.com/KB/cs/csharpcasts.aspx)

EDIT2 है: तो मूल रूप से एक गति बनाम सुरक्षा निर्णय

1

नहीं, मैं इसे काफ़ी का उपयोग करें। यह आपको एक साफ तरीके से InvalidCastException एस से बचने की अनुमति देता है।

उदाहरण के लिए

:

TreeViewItem tvItem = sender as TreeViewItem; 

if (tvItem != null) return; 

// Do stuff 

के रूप में करने का विरोध किया:

try 
{ 
    TreeViewItem tvItem = (TreeViewItem)sender; 
    // Do stuff. 
} 
catch (InvalidCastException ex) 
{ 
    // Didn't work, do something about it 
    return; // ... or not... 
} 
+0

आप किसी भी कारण के बारे में सोच सकते हैं कि "प्रेषक" एक TreeViewItem अन्य नहीं होगा एक बग से, ज्यादातर मामलों में? बग * * अपवाद उठाओ आईएमओ चाहिए। –

4

आपका उदाहरण बेहतर रूप में लिखा जाएगा:

if (sender is TreeViewItem) { 
    TreeViewItem i = (TreeViewItem)sender; 
    ... 
} 

यह बिल्कुल इस दोहरे प्रकार जाँच कर रहा है कि as ऑपरेटर से बचने में मदद कर सकते हैं। तो आपके उद्धृत उदाहरण के लिए, मैं कहूंगा कि यह निश्चित रूप से एक अच्छा समाधान है।

हालांकि, ऐसी स्थितियां हैं जहां आप वास्तव में एक कलाकार चाहते हैं। यदि आप TreeViewItem की अपेक्षा कर रहे हैं और कुछ और नहीं चाहते हैं, तो कास्टिंग सुनिश्चित करेगा कि InvalidCastException फेंक दिया गया है यदि आपको कुछ और दिया गया है।

बस अधिकांश स्थितियों में, यहां कोई कंबल नियम नहीं है: सही नौकरी के लिए सही उपकरण का उपयोग करें

+0

मेरी उदाहरण के लिए अपने विकल्प बेहतर धन्यवाद है, !! – Pwninstein

+0

यह फार्म भी जब वस्तु के रूप में थ्रेड डाली है जांच और नियमित कलाकारों के बीच प्रकार बदल सकते हैं समस्याओं का कारण बन सकता है। –

2

आप एक सादे (नल नहीं) मान प्रकार चाहते हैं, स्पष्ट रूप से यह काम नहीं करेगा, जैसे:

int test = sender as int; 

मान्य नहीं है, तथापि:

int? test = sender as int?; 

अनुमति दी है।

6

आम तौर पर, ये दो स्निपेट समकक्ष नहीं हैं। TreeViewItem i = sender as TreeViewItem एक सही परिणाम निकलेगा भले ही senderTreeViewItem का एक भव्य-पोती बच्चा है, जबकि sender.GetType() == typeof(TreeViewItem) हो जाएगा trueकेवलsender ठीक TreeViewItem और इसके संभावित उपवर्गों में से कोई भी है, जब।

1

तो गलत प्रकार हो रही एक बग हो सकता है, तो आप एक डाली उपयोग करना चाहिए। इसका कारण यह है कि वास्तव में एक समस्या है और आपको इसके बारे में पता होना चाहिए।

यदि यह संभव है कि मूल्य शून्य हो जाएगा, और यह तब होता है जब सिस्टम में यह एक बग नहीं होता है तो "as" का उपयोग करें। इसका कारण यह है कि आपको किसी भी समय "as" का उपयोग करना चाहिए जो शून्य वापस प्राप्त करना स्वीकार्य है।

, ध्यान रखें कि आप "के रूप में" का उपयोग नहीं कर सकते हैं मूल्य प्रकार कन्वर्ट करने के लिए रखें, क्योंकि शून्य मान उनके लिए स्वीकार्य नहीं है। यदि आपके पास कोई मान प्रकार है और "as" का उपयोग करना चाहते हैं, तो आपको एक शून्य मूल्य प्रकार का उपयोग करने की आवश्यकता होगी।

When to Use "as" Versus Casting

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