कीवर्ड के रूप में और इसके बीच अंतर है


121

कृपया बताएं कि C isऔर asकीवर्ड में क्या अंतर है #


7
जैसा है या जैसा है वैसा है? blogs.msdn.com/b/ericlippert/archive/2010/09/16/…
ल्यूक

3
यदि आप इस विषय में रुचि रखते हैं, तो आप शायद यह भी जानना चाहते हैं कि "के रूप में" और "कास्ट" ऑपरेटरों के बीच क्या अंतर है: blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
एरिक

7
क्या आप स्वीकृत उत्तर को चिन्हित करना चाहेंगे? यह दूसरों को इसी तरह के उत्तर की तलाश में मदद करेगा।
केएमएएन

जवाबों:


151

है

isऑपरेटर चेकों एक वस्तु एक विशेष प्रकार के लिए डाली जा सकता है।

उदाहरण:

if (someObject is StringBuilder) ...

जैसा

asऑपरेटर प्रयास एक विशिष्ट प्रकार के लिए एक वस्तु कास्ट करने के लिए, और रिटर्न शून्य अगर यह विफल रहता है।

उदाहरण:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

यह भी संबंधित:

ढलाई

डाली ऑपरेटर प्रयास एक विशिष्ट प्रकार के लिए एक वस्तु डाली, और एक अपवाद फेंकता है अगर यह विफल करने के लिए।

उदाहरण:

StringBuilder b = (StringBuilder)someObject.

4
यह सही नहीं है। isयह जाँच नहीं करता है कि कोई वस्तु किसी विशिष्ट प्रकार से डाली जा सकती है या नहीं। एक पूर्णांक एक लंबे समय तक ठीक रहता है, लेकिन 10 is longगलत है।
मार्टिन स्मिथ

9
@MartinSmith: आप कास्टिंग के साथ रूपांतरण टाइप कर रहे हैं। एक पूर्णांक को लंबे समय तक परिवर्तित किया जा सकता है, लेकिन इसे लंबे समय तक नहीं डाला जा सकता है क्योंकि यह लंबा नहीं है।
गुफा

2
आप मुझे बता रहे हैं कि एक पूर्णांक लंबे समय तक नहीं डाला जा सकता है? वह (long)some_integerअसफल हो जाएगा? मुझे पूरा यकीन है कि हम दोनों जानते हैं कि इसे चलाने के बिना भी सच नहीं है, इसलिए कृपया समझाएं कि आपका क्या मतलब है।
मार्टिन स्मिथ

12
@MartinSmith: आप अभी भी रूपांतरण के साथ कास्टिंग को भ्रमित कर रहे हैं। आप एक पूर्णांक को लंबे समय तक नहीं डाल रहे हैं, आप एक पूर्णांक को लंबे समय तक परिवर्तित कर रहे हैं। हालाँकि वे एक ही वाक्यविन्यास का उपयोग करते हैं, संदर्भ डाले जाते हैं और मान परिवर्तित होते हैं।
गुफ्फा

2
नोट के बारे मेंis : " ध्यान दें कि है । ऑपरेटर केवल संदर्भ के रूपांतरण, मुक्केबाजी रूपांतरण, और unboxing रूपांतरण इस तरह के उपयोगकर्ता परिभाषित रूपांतरण के रूप में अन्य रूपांतरण, समझता है, माना जाता है। " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx)। के बारे मेंas : " ध्यान दें कि जैसा कि ऑपरेटर केवल संदर्भ रूपांतरण, अशक्त रूपांतरण और बॉक्सिंग रूपांतरण करता है। ऑपरेटर के रूप में अन्य रूपांतरण, जैसे उपयोगकर्ता-परिभाषित रूपांतरण नहीं कर सकते हैं, जो कि कास्ट एक्सप्रेशन का उपयोग करके किया जाना चाहिए। " ( msdn) .microsoft.com / en-us / Library / cscsdfbt.aspx )
user1234567

33

IS और As के बीच अंतर यह है कि ।।

IS - क्या संचालक का उपयोग किसी दिए गए प्रकार के साथ किसी वस्तु की अनुकूलता की जांच करने के लिए किया जाता है और यह बूलियन (ट्रू या गलत) के रूप में परिणाम देता है।

AS - जैसा कि ऑपरेटर का उपयोग किसी दिए गए प्रकार या वर्ग के ऑब्जेक्ट की कास्टिंग के लिए किया जाता है।

पूर्व।

Student s = obj as Student;

के बराबर है:

Student s = obj is Student ? (Student)obj : (Student)null;

1
तुल्यता स्पष्ट रूप से दिखाती है कि दोनों में से कौन सा अधिक आदिम है और अपने रिश्ते को सुरुचिपूर्ण ढंग से पूरा करता है! तुल्यता के लिए धन्यवाद!
मूसा अल-परेशानी

1
@ मूसा-परेशानी वास्तव में यह नहीं दिखाती है कि कौन अधिक आदिम है। isके साथ व्यक्त किया जा सकता है asऔर के साथ व्यक्त किया asजा सकता है is। यहाँ कीवर्ड के isसाथ कैसे बना जाए asBool b = obj is Student; समतुल्य है: Bool b = (obj as Student) != null; इस पर अधिक यहाँ
एलेक्स तेलन

8

दोनों isऔर asकीवर्ड्स C # टाइप करने के लिए उपयोग किए जाते हैं।

जब आप दोनों कीवर्ड्स के आईएल कोड पर एक नज़र डालेंगे, तो आपको अंतर आसानी से मिल जाएगा।

C # कोड:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

आईएल कोड (ऊपर C # कोड के लिए संलग्न चित्र में है):

C # कोड से ऊपर के लिए IL कोडisकीवर्ड उपयोग के लिए IL कोड में IL निर्देश isinstaऔर दोनों शामिल हैं castclass
लेकिन asकीवर्ड उपयोग के लिए IL कोड केवल है isinsta

उपर्युक्त उपयोग में, दो टाइपकास्ट होगा जहां isकीवर्ड का उपयोग किया जाता है और केवल एक टाइपकास्ट जहां asकीवर्ड का उपयोग किया जाता है।

नोट: यदि आप isकिसी शर्त को जांचने के लिए कीवर्ड का उपयोग कर रहे हैं और टाइपकास्ट के परिणाम में कोई दिलचस्पी नहीं है, तो केवल एक ही क्रेडिटकास्ट होगा, अर्थात

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

isऔर asकीवर्ड का उपयोग आवश्यकता के आधार पर किया जाएगा।


6

क्या कीवर्ड यह जाँचता है कि क्या उसके बाईं ओर का मूल्य दाईं ओर के प्रकार का एक उदाहरण है। उदाहरण के लिए:

if(obj is string)
{
     ...
}

ध्यान दें कि इस स्थिति में आपको स्ट्रिंग के रूप में obj प्राप्त करने के लिए एक अतिरिक्त स्पष्ट कलाकारों का उपयोग करना होगा।

कीवर्ड का उपयोग अशक्त प्रकारों को डालने के लिए किया जाता है। यदि निर्दिष्ट मान निर्दिष्ट प्रकार का उदाहरण नहीं है, तो नल वापस आ गया है। उदाहरण के लिए:

string str = obj as string;
if(str != null)
{
     ...
}

+1 के लिए "जैसा कि कीवर्ड का उपयोग अशक्त प्रकारों को डालने के लिए किया जाता है।"
user2330678

3

मैं कहूँगा: MSDN ऑनलाइन पढ़ें, लेकिन यहाँ यह है:

ऑपरेटर यह जाँचता है कि क्या वस्तु किसी दिए गए प्रकार के साथ संगत है या नहीं, और मूल्यांकन का परिणाम एक बूलियन है: सही या गलत।

ऑपरेटर के रूप में एक अपवाद कभी नहीं फेंकेगा।


"के रूप में" ऑपरेटर या तो एक अपवाद नहीं फेंकेंगे, यह बस शून्य वापस आ जाएगा।
पिनते दानी

'के रूप में है' और 'के रूप में' टाइपो फिक्स्ड
पैट्रिक पीटर्स

2

ऑपरेटर, एक कास्ट है, अगर यह सफल होता है तो वापस लौटता है। यदि कलाकार असफल हो जाता है तो यह गलत हो जाता है। इसके साथ, आप परिवर्तित चर पर कब्जा नहीं कर सकते। यह ऑपरेटर सबसे उपयोगी होता है जब प्रकारों की जाँच करता है अगर-कथनों और अभिव्यक्तियों में। यह केवल कास्ट आदर्श है यदि परिणामी चर का उपयोग करने की आवश्यकता नहीं होगी

जैसा कि एक कास्ट है। इसके साथ, हम प्रदर्शन हासिल करते हैं और अपवादों से बचते हैं जब एक डाली अमान्य होती है। डाली असंभव होने पर नल वापस कर दिया जाता है। संदर्भ प्रकारों के लिए, एस-कास्ट की सिफारिश की जाती है। यह तेज़ और सुरक्षित दोनों है। हम परिणामी चर को नल के खिलाफ परीक्षण कर सकते हैं और फिर इसका उपयोग कर सकते हैं। यह अतिरिक्त जातियों को समाप्त करता है


2
  1. क्या ऑपरेटर यह जाँचता है कि क्या वस्तु सत्य या असत्य के आधार पर दिए गए प्रकार के अनुरूप है या नहीं।
  2. जैसा कि एक प्रकार से दूसरे प्रकार में डालने के लिए किया जाता है और रूपांतरण विफलता के बाद अपवाद को छोड़कर परिणाम शून्य हो जाता है। अच्छी तरह से उदाहरण के साथ बेहतर समझ के लिए लिंक देखें

2

है OPERATOR , C # में ऑपरेटर का उपयोग ऑब्जेक्ट प्रकार की जांच करने के लिए किया जाता है और यह एक बूल मान लौटाता है: यदि ऑब्जेक्ट एक ही प्रकार और सही है तो सही है। या यह भी कि "रन" ऑपरेटर का उपयोग यह जांचने के लिए किया जाता है कि किसी प्रकार का रन-टाइम किसी दिए गए प्रकार के अनुरूप है या नहीं। अशक्त वस्तुओं के लिए, यह गलत उदाहरण देता है

if(obj is AnimalObject)
{
 //Then Work
}

ऑपरेटर के रूप में

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

जैसे

Type obj = Object as Type;

ऑपरेटर के प्रकार के मामले में, ओवर टाइप करने के फायदे हैं , हमें दो चरण करने की आवश्यकता है:

Check the Type using is
If its true then Type cast

वास्तव में यह प्रदर्शन को प्रभावित करता है क्योंकि प्रत्येक और हर बार सीएलआर वंशानुक्रम पदानुक्रम के माध्यम से जाएगा, प्रत्येक आधार प्रकार को निर्दिष्ट प्रकार के खिलाफ जांचना।

इससे बचने के लिए, इसका उपयोग करें, यह इसे एक चरण में करेगा। केवल उस प्रकार की जाँच के लिए जिसे हमें ऑपरेटर का उपयोग करना चाहिए।


8 साल पुराने प्रश्नों का उत्तर देना जिनके पास पहले से ही बहुत सारे वैध उत्तर हैं, स्टैक ओवरफ्लो का उपयोग करने का सबसे अच्छा तरीका नहीं है।
क्लॉस जोर्जेंसन

1

As ऑपरेटर एक कास्ट के समान है, लेकिन यदि यह विफल रहता है, तो एक अपवाद के बजाय अशक्त है।

और यदि एक वस्तु एक निश्चित प्रकार के साथ संगत है, तो यह जांचने के लिए ऑपरेटर का उपयोग किया जाता है। यह आमतौर पर इफ स्टेटमेंट्स में उपयोग किया जाता है।


1

is: ऑपरेटर का उपयोग यह जांचने के लिए किया जाता है कि किसी प्रकार का रन-टाइम किसी दिए गए प्रकार के साथ संगत है या नहीं

as: संगत प्रकार के बीच रूपांतरण करने के लिए ऑपरेटर का उपयोग किया जाता है।

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
आपका उत्तर सही है, लेकिन आपका नमूना कोड एक प्रतिमान है। isतब ऐसा करना महंगा होता है as: यह दो बार अनबॉक्स हो जाता है। संदर्भ प्रकारों के लिए, आपको बस करना चाहिए as, फिर यह देखने के लिए कि यह काम किया है या नहीं।
स्टीवन सुदित

1

नीचे दिए गए यूट्यूब वीडियो पर एक नज़र डालें जो अधिक प्रदर्शनकारी और दृश्य तरीके में अंतर को बताता है: -

https://www.youtube.com/watch?v=IKmRtJcRX_I

नीचे कोड स्पष्टीकरण के साथ लंबा उत्तर दिया गया है।

"IS" कीवर्ड यह जांचने के लिए उपयोगी है कि क्या ऑब्जेक्ट एक प्रकार के साथ संगत हैं। उदाहरण के लिए नीचे दिए गए कोड में अगर हम जाँच रहे हैं कि "ओस्ट" ऑब्जेक्ट एक प्रकार का "ग्राहक" वर्ग है।

object ocust = new Customer();

if (ocust is Customer)
{ 

"AS" कीवर्ड एक प्रकार से दूसरे प्रकार में रूपांतरण करने में मदद करता है। उदाहरण के लिए नीचे दिए गए कोड में हम ऑब्जेक्ट को एक स्ट्रिंग डेटा प्रकार में परिवर्तित कर रहे हैं। यदि "AS" कीवर्ड टाइप करने में सक्षम नहीं है, तो यह NULL लौटाता है।

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

बनाम

MyClass myObject = obj as MyClass;

अगर क्लास माई कास्ट अपवाद नहीं है, तो ओब्ज मायक्लास नहीं है, तो दूसरा वापस आ जाएगा।

केवल सही या गलत लौटाएगा


1

IS और AS दोनों का इस्तेमाल सेफ टाइप कास्टिंग के लिए किया जाता है

IS Keyword -> यह जांचता है कि किसी दिए गए ऑब्जेक्ट का प्रकार नए ऑब्जेक्ट प्रकार के साथ संगत है या नहीं। यह कभी भी एक अपवाद नहीं है। यह एक बूलियन प्रकार है। या तो सच है या गलत है

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

AS Keyword: यह जांचता है कि किसी दिए गए ऑब्जेक्ट का प्रकार नए ऑब्जेक्ट प्रकार के साथ संगत है या नहीं। यह नॉन-नल लौटाता है यदि दी गई वस्तु नए के साथ संगत है, अन्यथा शून्य .. यह एक अपवाद फेंकता है।

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

दोनों ऑपरेटर सुरक्षित प्रकार की कास्टिंग के लिए उपयोग किए जाते हैं।

ऑपरेटर के रूप में:

एएस ऑपरेटर यह भी जाँचता है कि किसी दिए गए ऑब्जेक्ट का प्रकार नए ऑब्जेक्ट प्रकार के साथ संगत है या नहीं। यह कीवर्ड यह जाँच करेगा कि किसी दिए गए ऑब्जेक्ट का प्रकार नए ऑब्जेक्ट प्रकार के साथ संगत है या नहीं। यदि यह नए के साथ संगत नहीं है तो यह NULL को लौटा देगा।

संचालक:

यह ऑपरेटर जाँचता है कि क्या वस्तु का प्रकार नई वस्तु के साथ संगत है या नहीं। यदि यह संगत है तो यह सच है अन्यथा गलत है।


क्या आपको नहीं लगता कि यह 4 साल की तरह थोड़ा बहुत देर हो चुकी है?
सोनर ग्नूएल

ओह, हाँ ... क्षमा करें .... मैं स्टैकओवरफ़्लो के लिए नया हूँ ताकि थोड़ा बाहर निकल जाए ... पोस्ट की गई तारीख पर ध्यान नहीं दिया गया ...
तुकाराम

एक योगदान एक योगदान है! "सुरक्षित टाइपकास्टिंग" कीवर्ड को इंगित करने के लिए धन्यवाद! :-)
मूसा अल-परेशानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.