टाइपिंग की जाँच करें: टाइपोफ़, गेट टाइप, या है?


1511

मैंने देखा है कि बहुत से लोग निम्नलिखित कोड का उपयोग करते हैं:

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

लेकिन मुझे पता है कि आप भी ऐसा कर सकते हैं:

if (obj1.GetType() == typeof(int))
    // Some code here

या यह:

if (obj1 is int)
    // Some code here

निजी तौर पर, मुझे लगता है कि आखिरी सबसे साफ है, लेकिन क्या मुझे कुछ याद आ रहा है? कौन सा उपयोग करना सबसे अच्छा है, या यह व्यक्तिगत प्राथमिकता है?


27
मत भूलना as!
RCIX

82
asहालांकि वास्तव में
टाइपिंग

49
asनिश्चित रूप से टाइप-चेकिंग का एक रूप है, हर बिट जितना isहै! यह isपर्दे के पीछे प्रभावी ढंग से उपयोग करता है , और यह उन जगहों पर MSDN में सभी जगह उपयोग किया जाता है जहां यह कोड स्वच्छता बनाम में सुधार करता है isisपहले की जाँच करने के बजाय , एक asटाइप किए गए चर को स्थापित करने के लिए कॉल जो उपयोग के लिए तैयार है: यदि यह अशक्त है, तो उचित रूप से जवाब दें; अन्यथा, आगे बढ़ें। निश्चित रूप से कुछ मैंने देखा है और काफी इस्तेमाल किया है।
ज़ैकॉन

15
आपके मामले के लिए इसके शब्दार्थ कार्यों को मानते हुए as/ के पक्ष में महत्वपूर्ण प्रदर्शन अंतर है is( / stackoverflow.com/a/27813381/477420 पर कवर )।
अलेक्सई लेवेनकोव

@samusarin यह "प्रतिबिंब" का उपयोग नहीं करता है। जिस GetTypeविधि से आप लिंक कर रहे हैं, वह है System.Reflection.Assembly- यहां पूरी तरह से अलग विधि और अप्रासंगिक।
कर्क वॉक

जवाबों:


1846

सब अलग-अलग हैं।

  • typeof एक प्रकार का नाम लेता है (जिसे आप संकलन समय पर निर्दिष्ट करते हैं)।
  • GetType एक उदाहरण के रनटाइम प्रकार मिलता है।
  • is एक उदाहरण विरासत पेड़ में है, तो सच है।

उदाहरण

class Animal { } 
class Dog : Animal { }

void PrintTypes(Animal a) { 
    Console.WriteLine(a.GetType() == typeof(Animal)); // false 
    Console.WriteLine(a is Animal);                   // true 
    Console.WriteLine(a.GetType() == typeof(Dog));    // true
    Console.WriteLine(a is Dog);                      // true 
}

Dog spot = new Dog(); 
PrintTypes(spot);

किस बारे में typeof(T)? क्या इसे संकलन समय पर भी हल किया जाता है?

हाँ। T हमेशा वह होता है जो अभिव्यक्ति का प्रकार होता है। याद रखें, एक सामान्य विधि मूल रूप से उपयुक्त प्रकार के साथ तरीकों का एक पूरा गुच्छा है। उदाहरण:

string Foo<T>(T parameter) { return typeof(T).Name; }

Animal probably_a_dog = new Dog();
Dog    definitely_a_dog = new Dog();

Foo(probably_a_dog); // this calls Foo<Animal> and returns "Animal"
Foo<Animal>(probably_a_dog); // this is exactly the same as above
Foo<Dog>(probably_a_dog); // !!! This will not compile. The parameter expects a Dog, you cannot pass in an Animal.

Foo(definitely_a_dog); // this calls Foo<Dog> and returns "Dog"
Foo<Dog>(definitely_a_dog); // this is exactly the same as above.
Foo<Animal>(definitely_a_dog); // this calls Foo<Animal> and returns "Animal". 
Foo((Animal)definitely_a_dog); // this does the same as above, returns "Animal"

29
आह, इसलिए अगर मेरे पास एक फोर्ड वर्ग है जो कार से निकलता है और फोर्ड का एक उदाहरण है, तो उस उदाहरण पर "कार" की जाँच करना सही होगा। समझ में आता है!
जस्सोन्

2
स्पष्ट करने के लिए, मुझे इसके बारे में पता था, लेकिन मैंने एक कोड नमूना जोड़ने से पहले टिप्पणी की थी। मैं आपके पहले से ही उत्कृष्ट उत्तर के लिए कुछ स्पष्ट अंग्रेजी स्पष्टता जोड़ने की कोशिश करना चाहता था।
जासं

12
@ शमी यदि टाइपो का संकलन समय पर मूल्यांकन किया जाता है और गेटटाइम () रनटाइम पर मूल्यांकन किया जाता है, तो यह समझ में आता है कि गेटटाइप () मामूली प्रदर्शन हिट
लगाता है

नए कुत्ते के बारे में क्या है? (GetType) पशु या टाइपोफ़ (कुत्ता) पशु है, यह सिर्फ एक चेतावनी देता है और एक त्रुटि नहीं?
प्रेरक Pr

7
@PrakKK new Dog().GetType() is Animalगलत प्रकार का रिटर्न (और साथ ही आपका अन्य संस्करण) .GetType()देता है क्योंकि यह एक प्रकार की वस्तु है Type, और Typeनहीं है Animal
मार्टन

194

typeofजब आप संकलन समय पर प्राप्त करना चाहते हैं तो इसका उपयोग करें । GetTypeजब आप निष्पादन के समय टाइप करना चाहते हैं, तब उपयोग करें । उपयोग करने के लिए शायद ही कोई मामले हैं isक्योंकि यह एक कास्ट करता है और, ज्यादातर मामलों में, आप वैसे भी चर का अंत करते हैं।

एक चौथा विकल्प है, जिस पर आपने विचार नहीं किया है (विशेषकर यदि आप किसी ऑब्जेक्ट को आप जिस तरह से भी ढूंढते हैं, उसे डालने जा रहे हैं); इसका उपयोग करना है as

Foo foo = obj as Foo;

if (foo != null)
    // your code here

यह केवल एक कलाकार का उपयोग करता है जबकि यह दृष्टिकोण:

if (obj is Foo)
    Foo foo = (Foo)obj;

की आवश्यकता है दो की

अपडेट (जनवरी 2020):

  • C # 7+ के अनुसार , आप अब इनलाइन डाल सकते हैं, इसलिए 'is' दृष्टिकोण अब एक कलाकारों में भी किया जा सकता है।

उदाहरण:

if(obj is Foo newLocalFoo)
{
    // For example, you can now reference 'newLocalFoo' in this local scope
    Console.WriteLine(newLocalFoo);
}

4
.NET 4 में परिवर्तन के साथ isअभी भी एक कलाकार प्रदर्शन करता है ?
अहिस्ताले

6
क्या यह उत्तर सही है? क्या यह सच है कि आप वास्तव में टाइपोफ () में एक उदाहरण दे सकते हैं? मेरा अनुभव नं। रहा है, लेकिन मुझे लगता है कि यह आम तौर पर सच है कि एक उदाहरण की जाँच रनटाइम में हो सकती है, जबकि एक कक्षा की जाँच करना संकलन समय पर संभव होना चाहिए।
जॉन Coombs

4
@ जोंन (आपके q के बाद 4 वर्ष), नहीं, आप इसमें कोई उदाहरण नहीं दे सकते हैं typeof(), और यह उत्तर आपको सुझाव नहीं दे सकता है। आप इसके बजाय टाइप करते हैं, यानी, typeof(string)काम करता है, typeof("foo")नहीं करता है।
हाबिल

मेरा मानना isहै कि आईएल में विशेष संचालन के रूप में इस तरह का प्रदर्शन नहीं किया जाता है।
abatishchev

3
अब हम कर सकते हैंif (obj is Foo foo) { /* use foo here */ }
इवान गार्सिया टोपेटे

71

1।

Type t = typeof(obj1);
if (t == typeof(int))

यह अवैध है, क्योंकि typeofकेवल प्रकार पर काम करता है, चर पर नहीं। मुझे लगता है कि obj1 एक चर है। तो, इस तरह typeofसे स्थिर है, और रनटाइम के बजाय संकलन समय पर अपना काम करता है।

2।

if (obj1.GetType() == typeof(int))

यह है trueअगर obj1बिल्कुल प्रकार का है int। अगर obj1व्युत्पन्न से int, अगर हालत हो जाएगा false

3।

if (obj1 is int)

यह है trueअगर obj1एक है int, या अगर यह एक वर्ग से प्राप्त होता है जिसे बुलाया जाता है int, या यदि यह एक इंटरफ़ेस को लागू करता है int


1 के बारे में सोचकर, आप सही हैं। और फिर भी, मैंने इसे यहां कई कोड नमूनों में देखा है। यह टाइप t = obj1.GetType () होना चाहिए;
जसन

4
हां, मुझे ऐसा लगता है। "टाइपऑफ़ (ओबीजे 1)" जब मैं इसे आज़माता हूं, तो संकलन नहीं करता है।
स्कॉट लंघम

4
यह System.Int32 या C # में किसी अन्य मान प्रकार से प्राप्त करना असंभव है
reggaeguitar

क्या आप बता सकते हैं कि टाइपोफ (टाइपोफ (system.int32)) क्या होगा
सना

1
@ साना, आप इसे क्यों नहीं आजमाते हैं :) मुझे लगता है कि आपको सिस्टम का एक उदाहरण वापस मिल जाएगा। टाइप करें जो System.Type का प्रतिनिधित्व करता है! टाइपोफ़ के
स्कॉट लैंगहम

53
Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

यह एक त्रुटि है। C # में टाइपऑफ़ ऑपरेटर केवल टाइप नाम ले सकता है, ऑब्जेक्ट नहीं।

if (obj1.GetType() == typeof(int))
    // Some code here

यह काम करेगा, लेकिन शायद वैसा नहीं जैसा आप उम्मीद करेंगे। मूल्य प्रकारों के लिए, जैसा कि आपने यहां दिखाया है, यह स्वीकार्य है, लेकिन संदर्भ प्रकारों के लिए, यह केवल तभी सही होगा जब प्रकार सटीक एक ही प्रकार का था, न कि वंशानुगत पदानुक्रम में कुछ और। उदाहरण के लिए:

class Animal{}
class Dog : Animal{}

static void Foo(){
    object o = new Dog();

    if(o.GetType() == typeof(Animal))
        Console.WriteLine("o is an animal");
    Console.WriteLine("o is something else");
}

यह प्रिंट होगा "o is something else", क्योंकि प्रकार oहै Dog, नहीं Animal। आप यह कार्य कर सकते हैं, हालाँकि, यदि आप कक्षा की IsAssignableFromपद्धति का उपयोग करते हैं Type

if(typeof(Animal).IsAssignableFrom(o.GetType())) // note use of tested type
    Console.WriteLine("o is an animal");

यह तकनीक अभी भी एक बड़ी समस्या है। यदि आपका चर शून्य है, तो कॉल GetType()NullReferenceException को फेंक देगा। तो यह सही ढंग से काम करने के लिए, आप करेंगे:

if(o != null && typeof(Animal).IsAssignableFrom(o.GetType()))
    Console.WriteLine("o is an animal");

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

if(o is Animal)
    Console.WriteLine("o is an animal");

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

if(o is Animal)
    ((Animal)o).Speak();

लेकिन इससे सीएलआर दो बार ऑब्जेक्ट के प्रकार की जांच करता है। यह isऑपरेटर को संतुष्ट करने के लिए एक बार इसकी जांच करेगा , और यदि oवास्तव में ए है Animal, तो हम इसे कास्ट को मान्य करने के लिए फिर से जांच करते हैं।

इसके बजाय ऐसा करना अधिक कुशल है:

Animal a = o as Animal;
if(a != null)
    a.Speak();

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

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

(o as Animal).Speak();

इस मामले में, डेवलपर स्पष्ट रूप से यह सोचते है कि oहोगा हमेशा एक हो Animal, और जब तक उनकी धारणा सही है, तो सब कुछ ठीक काम करता है। लेकिन अगर वे गलत हैं, तो वे जो यहां समाप्त करते हैं वह एक है NullReferenceException। एक नियमित कलाकारों के साथ, वे एक मिल गया होताInvalidCastException बदले , जो समस्या को अधिक सही ढंग से पहचानता था।

कभी-कभी, इस बग को ढूंढना मुश्किल हो सकता है:

class Foo{
    readonly Animal animal;

    public Foo(object o){
        animal = o as Animal;
    }

    public void Interact(){
        animal.Speak();
    }
}

यह एक और मामला है जहां डेवलपर स्पष्ट रूप से हर बार oहोने की उम्मीद कर रहा है Animal, लेकिन यह स्पष्ट नहीं है कि निर्माता, जहां asकलाकारों का उपयोग किया जाता है। यह तब तक स्पष्ट नहीं है जब तक आप उस Interactविधि से नहीं मिलते हैं , जहां animalक्षेत्र को सकारात्मक रूप से सौंपा जाना अपेक्षित है। इस मामले में, न केवल आप एक भ्रामक अपवाद के साथ समाप्त होते हैं, लेकिन यह तब तक नहीं फेंका जाता है जब तक कि वास्तविक त्रुटि होने पर संभावित रूप से बहुत बाद में।

संक्षेप में:

  • यदि आपको केवल यह जानना है कि वस्तु किसी प्रकार की है या नहीं, तो उपयोग करें is

  • यदि आपको किसी निश्चित प्रकार के उदाहरण के रूप में किसी वस्तु का इलाज करने की आवश्यकता है, लेकिन आप यह नहीं जानते हैं कि वस्तु उस प्रकार की होगी, तो उपयोग करें asऔर जांच करें null

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


अगर (ओ एनिमल है) ((एनिमल) ओ) .स्पीक (); ? क्या आप अधिक जानकारी दे सकते हैं?
बटमासी

2
@batmaci: यह उत्तर में है - यह दो प्रकार के चेक का कारण बनता है। पहली बार है o is Animal, जिसमें सीएलआर को यह जांचने की आवश्यकता होती है कि क्या चर oका प्रकार ए है Animal। दूसरी बार जब यह जाँच करता है तो यह कथन में आता है ((Animal)o).Speak()। दो बार जांच के बजाय, एक बार जांच कर लें as
बजे

मुझे यह एक बहुत अच्छा स्पष्टीकरण मिला, स्पष्ट करने के लिए धन्यवाद!
पॉल एफफोर्ड

16

यदि आप C # 7 का उपयोग कर रहे हैं, तो यह एंड्रयू हरे के शानदार जवाब के अपडेट का समय है। पैटर्न मिलान ने एक अच्छा शॉर्टकट पेश किया है जो हमें एक अलग घोषणा / कास्ट और जांच की आवश्यकता के बिना, यदि कथन के संदर्भ में एक टाइप किया गया चर देता है:

if (obj1 is int integerValue)
{
    integerValue++;
}

यह इस तरह के एकल कलाकारों के लिए बहुत कम लगता है, लेकिन वास्तव में चमकता है जब आपके पास अपनी दिनचर्या में आने वाले कई संभावित प्रकार होते हैं। नीचे दो बार कास्टिंग से बचने का पुराना तरीका है:

Button button = obj1 as Button;
if (button != null)
{
    // do stuff...
    return;
}
TextBox text = obj1 as TextBox;
if (text != null)
{
    // do stuff...
    return;
}
Label label = obj1 as Label;
if (label != null)
{
    // do stuff...
    return;
}
// ... and so on

इस कोड को जितना संभव हो सके सिकुड़ते हुए काम करना, साथ ही एक ही वस्तु के डुप्लीकेट कास्ट्स से बचना हमेशा मुझे परेशान करता है। ऊपर निम्न पैटर्न से मेल खाते हुए अच्छी तरह से संपीड़ित है:

switch (obj1)
{
    case Button button:
        // do stuff...
        break;
    case TextBox text:
        // do stuff...
        break;
    case Label label:
        // do stuff...
        break;
    // and so on...
}

संपादित करें: Palec की टिप्पणी के अनुसार एक स्विच का उपयोग करने के लिए लंबा नया तरीका अपडेट किया गया।


1
इस मामले में switchपैटर्न मिलान के साथ कथन का उपयोग करना उचित है।
पालिक

आप एक के साथ कैसे सामना करेंगे? इस विशेष कोड ब्लॉक में? if (obj1 is int integerValue) { integerValue++; }
बेन वर्टॉन्गन

बेन, अगर मैं आपके प्रश्न को समझता हूं, तो मेरे पास अन्य मामलों को संभालने के लिए एक और बयान होगा क्योंकि आप एक पूर्णांक चर में एक पूर्णांक नहीं डाल सकते हैं। :)
जोएलक

14

मेरे पास Typeतुलना करने और उपयोग न करने is(जैसे my_type is _BaseTypetoLookFor) करने के लिए एक -प्रश्न था , लेकिन मैं इनका उपयोग कर सकता था:

base_type.IsInstanceOfType(derived_object);
base_type.IsAssignableFrom(derived_type);
derived_type.IsSubClassOf(base_type);

ध्यान दें कि IsInstanceOfTypeऔर उसी प्रकार की तुलना करते समय IsAssignableFromवापस लौटें true, जहां IsSubClassOf वापस आ जाएगा false। और IsSubclassOfइंटरफेस पर काम नहीं करता है, जहां अन्य दो करते हैं। ( यह सवाल और जवाब भी देखें ।)

public class Animal {}
public interface ITrainable {}
public class Dog : Animal, ITrainable{}

Animal dog = new Dog();

typeof(Animal).IsInstanceOfType(dog);     // true
typeof(Dog).IsInstanceOfType(dog);        // true
typeof(ITrainable).IsInstanceOfType(dog); // true

typeof(Animal).IsAssignableFrom(dog.GetType());      // true
typeof(Dog).IsAssignableFrom(dog.GetType());         // true
typeof(ITrainable).IsAssignableFrom(dog.GetType()); // true

dog.GetType().IsSubclassOf(typeof(Animal));            // true
dog.GetType().IsSubclassOf(typeof(Dog));               // false
dog.GetType().IsSubclassOf(typeof(ITrainable)); // false

9

मुझे पसंद है

यही कारण है, ने कहा कि अगर आप का उपयोग कर रहे है , आप की संभावना कर रहे हैं नहीं ठीक से वंशानुक्रम का उपयोग।

मान लें कि व्यक्ति: इकाई, और वह पशु: इकाई। फ़ीड इकाई में एक आभासी तरीका है (नील को खुश करने के लिए)

class Person
{
  // A Person should be able to Feed
  // another Entity, but they way he feeds
  // each is different
  public override void Feed( Entity e )
  {
    if( e is Person )
    {
      // feed me
    }
    else if( e is Animal )
    {
      // ruff
    }
  }
}

बल्कि

class Person
{
  public override void Feed( Person p )
  {
    // feed the person
  }
  public override void Feed( Animal a )
  {
    // feed the animal
  }
}

1
यह सच है, मैं कभी ऐसा नहीं करूंगा, यह जानकर कि व्यक्ति पशु से उत्पन्न होता है।
जसन

3
उत्तरार्द्ध वास्तव में वंशानुक्रम का उपयोग नहीं कर रहा है। फू को एंटिटी का एक आभासी तरीका होना चाहिए जो व्यक्ति और पशु में ओवरराइड होता है।
नील विलियम्स

2
@ बोबोबोबो मुझे लगता है कि आपका मतलब "ओवरलोडिंग" है, न कि "इनहेरिटेंस"।
एलसी।

@ एलसी: नहीं, मेरा मतलब विरासत है। पहला उदाहरण अलग व्यवहार प्राप्त करने के लिए एक तरह का गलत तरीका (उपयोग करना ) है। दूसरा उदाहरण ओवरलोडिंग हाँ का उपयोग करता है, लेकिन इसके उपयोग से बचा जाता है
बोब्बोबो

1
उदाहरण के साथ समस्या यह है कि यह पैमाने पर नहीं होगा। यदि आपने खाने के लिए आवश्यक नई इकाइयां जोड़ी हैं (उदाहरण के लिए एक कीट या एक राक्षस) तो आपको इकाई वर्ग में एक नई विधि जोड़ने की आवश्यकता होगी और फिर इसे उप-वर्ग में ओवरराइड करें जो इसे खिलाएगा। यह किसी भी सूची से अधिक बेहतर नहीं है यदि (इकाई X है) तो (यदि इकाई Y है) ... यह LSP और OCP का उल्लंघन करता है, तो विरासत शायद समस्या का सबसे अच्छा समाधान नहीं है। प्रतिनिधिमंडल के कुछ रूप को शायद पसंद किया जाएगा।
ebrown

5

मेरा मानना ​​है कि अंतिम भी वंशानुक्रम को देखता है (उदाहरण के लिए कुत्ता पशु == सच है), जो ज्यादातर मामलों में बेहतर है।


2

यह इस बात पर निर्भर करता है कि मैं क्या कर रहा हूं। अगर मुझे बूल मूल्य की आवश्यकता है (कहते हैं, यह निर्धारित करने के लिए कि क्या मैं इंट में डालूंगा), तो मैं उपयोग करूंगा is। अगर मुझे वास्तव में किसी कारण के लिए प्रकार की आवश्यकता है (कहो, किसी अन्य विधि से पारित करने के लिए) मैं उपयोग करूँगा GetType()


1
अच्छी बात। मैं यह उल्लेख करना भूल गया कि मुझे यह प्रश्न कई उत्तरों को देखने के बाद मिला है जो एक प्रकार की जांच करने के लिए एक if स्टेटमेंट का उपयोग करते हैं।
जसन

0

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


0

एक प्रकार के लिए System.Type ऑब्जेक्ट प्राप्त करने के लिए उपयोग किया जाता है। एक टाइपो अभिव्यक्ति निम्नलिखित रूप लेती है:

System.Type type = typeof(int);

Example:

    public class ExampleClass
    {
       public int sampleMember;
       public void SampleMethod() {}

       static void Main()
       {
          Type t = typeof(ExampleClass);
          // Alternatively, you could use
          // ExampleClass obj = new ExampleClass();
          // Type t = obj.GetType();

          Console.WriteLine("Methods:");
          System.Reflection.MethodInfo[] methodInfo = t.GetMethods();

          foreach (System.Reflection.MethodInfo mInfo in methodInfo)
             Console.WriteLine(mInfo.ToString());

          Console.WriteLine("Members:");
          System.Reflection.MemberInfo[] memberInfo = t.GetMembers();

          foreach (System.Reflection.MemberInfo mInfo in memberInfo)
             Console.WriteLine(mInfo.ToString());
       }
    }
    /*
     Output:
        Methods:
        Void SampleMethod()
        System.String ToString()
        Boolean Equals(System.Object)
        Int32 GetHashCode()
        System.Type GetType()
        Members:
        Void SampleMethod()
        System.String ToString()
        Boolean Equals(System.Object)
        Int32 GetHashCode()
        System.Type GetType()
        Void .ctor()
        Int32 sampleMember
    */

यह नमूना उस प्रकार को निर्धारित करने के लिए गेट टाइप विधि का उपयोग करता है जिसका उपयोग संख्यात्मक गणना के परिणाम के लिए किया जाता है। यह परिणामी संख्या की भंडारण आवश्यकताओं पर निर्भर करता है।

    class GetTypeTest
    {
        static void Main()
        {
            int radius = 3;
            Console.WriteLine("Area = {0}", radius * radius * Math.PI);
            Console.WriteLine("The type is {0}",
                              (radius * radius * Math.PI).GetType()
            );
        }
    }
    /*
    Output:
    Area = 28.2743338823081
    The type is System.Double
    */

-4
if (c is UserControl) c.Enabled = enable;

4
कृपया अधिक जानकारी के साथ संपादित करें। कोड-ओनली एंड "ट्राय दिस" जवाबों को हतोत्साहित किया जाता है, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं होती है, और यह नहीं समझाते कि किसी को "कोशिश" क्यों करनी चाहिए।
abarisone

आपका उत्तर प्रश्न से असंबंधित है।
menxin

-5

आप C # में "टाइपोफ़ ()" ऑपरेटर का उपयोग कर सकते हैं, लेकिन आपको System.IO का उपयोग करके नामस्थान को कॉल करने की आवश्यकता है; यदि आप एक प्रकार की जांच करना चाहते हैं तो आपको "कीवर्ड" का उपयोग करना चाहिए।


7
typeofनामस्थान में परिभाषित नहीं है, यह एक कीवर्ड है। System.IOइससे कोई लेना-देना नहीं है।
आर्टुरो टॉरेस सेंचेज

-5

प्रदर्शन परीक्षण टाइपोफ़ () बनाम गेट टाइप ():

using System;
namespace ConsoleApplication1
    {
    class Program
    {
        enum TestEnum { E1, E2, E3 }
        static void Main(string[] args)
        {
            {
                var start = DateTime.UtcNow;
                for (var i = 0; i < 1000000000; i++)
                    Test1(TestEnum.E2);
                Console.WriteLine(DateTime.UtcNow - start);
            }
            {
                var start = DateTime.UtcNow;
                for (var i = 0; i < 1000000000; i++)
                    Test2(TestEnum.E2);
                Console.WriteLine(DateTime.UtcNow - start);
            }
            Console.ReadLine();
        }
        static Type Test1<T>(T value) => typeof(T);
        static Type Test2(object value) => value.GetType();
    }
}

डीबग मोड में परिणाम:

00:00:08.4096636
00:00:10.8570657

रिलीज मोड में परिणाम:

00:00:02.3799048
00:00:07.1797128

1
प्रदर्शन के उपायों के लिए किसी को DateTime.UtcNow का उपयोग नहीं करना चाहिए। आपके कोड के साथ लेकिन स्टॉपवॉच वर्ग के साथ मुझे डिबग मोड के लिए लगातार विपरीत परिणाम मिले। UseTypeOf: 00: 00: 14.5074469 UseGetType: 00: 00: 10.5799534 रिलीज मोड वही है, जैसा कि अपेक्षित था
एलेक्सी शचरबाक

@AlexeyShcherbak स्टॉपवॉच और DateTime.Now के बीच अंतर 10-20 एमएस से अधिक नहीं हो सकता है, फिर से अपना कोड जांचें। और मुझे अपने परीक्षण में मिलीसेकंड की परवाह नहीं है। साथ ही मेरा कोड स्टॉपवॉच के साथ लंबे समय तक कोड की कई लाइनें होंगी।
अलेक्जेंडर वासिलीव

1
यह सामान्य रूप से बुरा व्यवहार है, आपके विशेष मामले में नहीं।
एलेक्सी शचरबाक

4
@AlexanderVasilyev कोड की पंक्तियों की मात्रा का उपयोग कभी भी किसी दस्तावेज को भ्रामक करने के तर्क के रूप में नहीं किया जाना चाहिए । जैसा कि msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx में देखा गया है , DateTimeयदि आपको OS के टाइमफ़्रेम का उपयोग करने के बाद 100ms से कम समय के लिए चिंतित होना चाहिए , तो इसका उपयोग नहीं किया जाना चाहिए । तुलनात्मक रूप से Stopwatch, जो प्रोसेसर का उपयोग करता है ' Tick, DateTimeWin7 में एक द्वारा उपयोग किया जाने वाला रिज़ॉल्यूशन एक 15 सेमी है।
एरिक वू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.