2010-06-10 12 views
51

Unity जानने की कोशिश कर, मैं MVC में GetControllerInstance अधिभावी के लिए निम्न कोड दिखाई दे रहा है जबकि:उपयोग और "है" सी # में कीवर्ड

if(!typeof(IController).IsAssignableFrom(controllerType)) { ... } 

इस मुझे लगता है मूल रूप से

लेखन की एक बहुत जटिल तरीका
if(controllerType is IController) { ... } 

मैं सराहना वहाँ is और IsAssignableFrom, के बीच सूक्ष्म अंतर यानी IsAssignableFrom डाली रूपांतरण शामिल नहीं करता है, लेकिन मैं इस differenc के निहितार्थ को समझने के लिए संघर्ष कर रहा हूँ व्यावहारिक परिदृश्य में ई।

is से अधिक चुनने के लिए अपमानजनक कब है? GetControllerExample में इससे क्या अंतर आएगा?

if (!typeof(IController).IsAssignableFrom(controllerType)) 
     throw new ArgumentException(...); 
return _container.Resolve(controllerType) as IController; 

उत्तर

80

यह वही नहीं है।

if(controllerType is IController) 

होगा हमेशाfalse का मूल्यांकन controllerType हमेशा एक Type है, और एक Type एक IController कभी नहीं है के बाद से।

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

IsAssignableFrom विधि का उपयोग यह जांचने के लिए किया जाता है कि टाइप किसी दिए गए प्रकार के साथ संगत है।

+0

आह ठीक है अब अंतर स्पष्ट है। मुझे यह देखना चाहिए था! – fearofawhackplanet

+0

तो मेरा अनुमान है कि यदि 'टी' और' यू 'जेनेरिक प्रकार हैं तो टाइप टाइप (टी) IsAssignableFrom (टाइपोफ (यू)) '' नया टी() यू' जैसा ही है? – orad

+1

नहीं, लेकिन यह 'नया यू() टी' जैसा ही होगा। टी आधार प्रकार होगा। मैं हमेशा उस से छुटकारा पाता हूं। मुझे बस याद है कि 'IsAssignableFrom' 'is' ऑपरेटर के विपरीत चला जाता है। – Jordan

16

is कीवर्ड केवल उदाहरणों के लिए लागू होता है जबकि Type.IsAssignableFrom() केवल प्रकारों के लिए लागू होता है।

उदाहरण के is

string str = "hello world"; 
if(str is String) 
{ 
    //str instance is of type String 
} 

ध्यान दें कि str एक उदाहरण है और प्रकार है।

उदाहरण के IsAssignableFrom()

string str = "hello world"; 
if(typeof(Object).IsAssignableFrom(str.GetType())) 
{ 
    //instances of type String can be assigned to instances of type Object. 
} 

if(typeof(Object).IsAssignableFrom(typeof(string))) 
{ 
    //instances of type String can be assigned to instances of type Object. 
} 

ध्यान दें कि, IsAssignableFrom को तर्क() स्ट्रिंग के कहने नहीं है, यह प्रकार स्ट्रिंग प्रकार का प्रतिनिधित्व वस्तु है।

21

typeof(IController).IsAssignableFrom(controllerType) इंटरफ़ेस के विरुद्ध Type का परीक्षण करता है। is ऑपरेटर इंटरफ़ेस के खिलाफ एक उदाहरण परीक्षण करता है।

+2

यह टिप्पणी मेरे लिए सबसे स्पष्ट है। – Phil

5

एक उल्लेखनीय अंतर यह भी है कि 'है' विरासत या इंटरफ़ेस कार्यान्वयन के परीक्षण के लिए सहज ज्ञान प्रदान करता है, जबकि IsAssignableFrom इसके चेहरे पर कुछ भी समझ में आता है। Type.IsAssignableFrom विधि का नाम अस्पष्ट परीक्षण या इंटरफ़ेस कार्यान्वयन का पता लगाने के लिए लागू होने पर अस्पष्ट और भ्रमित है।इन उद्देश्यों के लिए निम्नलिखित आवरण और अधिक सहज ज्ञान युक्त, पठनीय आवेदन कोड के लिए होगा:

public static bool CanBeTreatedAsType(this Type CurrentType, Type TypeToCompareWith) 
    { 
     // Always return false if either Type is null 
     if (CurrentType == null || TypeToCompareWith == null) 
      return false; 

     // Return the result of the assignability test 
     return TypeToCompareWith.IsAssignableFrom(CurrentType); 
    } 

फिर, एक और समझा जा सकता ग्राहक वाक्य रचना की तरह हो सकता है:

bool CanBeTreatedAs = typeof(SimpleChildClass).CanBeTreatedAsType(typeof(SimpleClass)); 
    CanBeTreatedAs = typeof(SimpleClass).CanBeTreatedAsType(typeof(IDisposable)); 

के बजाय इस विधि का लाभ 'है' कीवर्ड यह है कि इसे अज्ञात, मनमाना प्रकारों का परीक्षण करने के लिए रन-टाइम पर उपयोग किया जा सकता है, जबकि 'है' कीवर्ड (और एक सामान्य प्रकार पैरामीटर) विशिष्ट प्रकार के संकलन-समय ज्ञान की आवश्यकता होती है।

+0

मुझे नहीं पता कि 'IsAssignableFrom' पूरी तरह से अनजान है। एक पॉलिमॉर्फिक प्रकार प्रणाली में, किसी भी प्रकार को इसके किसी भी उपप्रकार से मूल्य आवंटित किया जा सकता है, यानी आप कुछ ऐसा कर सकते हैं: 'SimpleBaseClass myVar = new SimpleChildClass() '। 'IsAssignableFrom' आपको बताता है कि क्या ऐसा पॉलीमोर्फिक असाइनमेंट कानूनी होगा, और इस प्रकार एक प्रकार एक उपप्रकार-या-बराबर है। – zstewart

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