2011-03-27 12 views
32

log4net configuration manual लेखक typeof(MyApp) का उपयोग करता युक्त वर्ग MyApp के प्रकार के प्राप्त करने के लिए के पहले उदाहरण में। क्या this.GetType() का उपयोग करने का कोई कारण नहीं है, प्रदर्शन के अनुसार? क्योंकि ऐसा लगता है कि this.GetType() किसी अन्य वर्ग में कॉपी करते समय संभावित प्रति-पेस्ट त्रुटियों से अधिक सुरक्षित है।सी # प्रदर्शन प्रश्न: typeof (MyClass) बनाम this.GetType()

+4

जब आपके पास कोई उदाहरण नहीं है, तो केवल TYPEOF उपलब्ध है, है ना? –

उत्तर

77

टाइपऑफ (फू) एक स्थिर प्रकार का लुकअप है; अनिवार्य रूप से यह संकलन समय पर होता है, इसलिए आपको केवल स्पष्ट रूप से नामित प्रकार मिलता है।

GetType() एक गतिशील प्रकार लुकअप है; यह एक वर्चुअल विधि है जिसे रनटाइम पर बुलाया जाता है और यदि आप पॉलिमॉर्फिज्म का उपयोग कर रहे हैं तो भी आपको सटीक प्रकार देगा। तो यह सैद्धांतिक रूप से "धीमा" है, लेकिन यह आपको कुछ दे रहा है जिसे आप टाइपफ़ो (टी) से नहीं प्राप्त कर सकते हैं। अगर आपको अपने डिजाइन के लिए एक या दूसरे की ज़रूरत है, तो गति एक कारक नहीं होने वाली है।

+1

माइक - आपने थ्रो 'द' टिप्पणियां काट दीं और यहां एक संक्षिप्त परिभाषा प्रदान की। +1 –

13

प्रदान किए गए उदाहरण में GetType प्रदर्शन विकल्प एक विकल्प भी नहीं है क्योंकि यह उदाहरण विधि है; इसे एक फील्ड-प्रारंभकर्ता से नहीं कहा जा सकता है। किसी भी मामले में, चूंकि एक स्थिर 'संदर्भ' से स्थैतिक फ़ील्ड प्रारंभ करना है, तर्कसंगत रूप से this संदर्भ उपलब्ध नहीं हो सकता है - इसलिए स्थैतिक-रचनाकार मार्ग नीचे जाकर GetType को अनुमति देने में सहायता नहीं होगी।

// Can't use GetType() - the this reference is not available. 
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp)); 
+0

आप सही हैं, मेरे बारे में बेवकूफ 'स्थिर' कीवर्ड को नोटिस नहीं करना :) –

+2

@Ani, लेकिन प्रदर्शन के बारे में क्या, जब वस्तु और प्रकार दोनों नाम ज्ञात हैं? – Shimmy

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