मैं C # में एक चर का डेटा प्रकार कैसे प्राप्त कर सकता हूं?


92

मैं कैसे पता लगा सकता हूं कि कुछ चर किस डेटा प्रकार को पकड़े हुए हैं? (जैसे int, string, char इत्यादि)

मेरे पास अब ऐसा कुछ है:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Testing
{
    class Program
    {
        static void Main()
        {
            Person someone = new Person();
            someone.setName(22);
            int n = someone.getName();
            Console.WriteLine(n.typeOf());
        }
    }

    class Person
    {
        public int name;

        public void setName(int name)
        {
            this.name = name;
        }

        public int getName()
        {
            return this.name;
        }
    }
}

6
आपने पहले ही टाइप कर दिया है -int
— Jamiec

यह स्पष्ट नहीं है कि आपके द्वारा "डेटा प्रकार का पता लगाने" से क्या मतलब है। आम तौर पर, उत्तर "आप केवल कक्षा के सदस्य के हस्ताक्षर को देखते हैं और प्रकार स्पष्ट रूप से वहाँ बताया गया है"। क्या आपका इरादा रन टाइम में क्लास के सदस्यों का निरीक्षण करने का है?
— विकटोर ज़िकला

1
विषय से बाहर, लेकिन आपने यहां जो लिखा है, वह C #: class Person { public string Name { get; set; } }या के साथ इस तरह लिखा गया है class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }। गुण के
— स्टीव बी

1
जमीक सही है। स्टेटिक टाइपिंग का अर्थ है कि घोषणा आपके प्रकार को हमेशा के लिए निर्धारित करती है। आपका चर n केवल आपके द्वारा घोषित प्रकार, या विरासत में मिला प्रकार हो सकता है। आपके विशिष्ट मामले में आपने एक इंट प्रदर्शित करने के लिए चुना, यह एक प्रकार है जिसे आप विरासत में नहीं ले सकते हैं, इसलिए एन केवल एक इंट हो सकता है।
— Ksempac

जवाबों:


117

एक महत्वपूर्ण और सूक्ष्म मुद्दा है जो उनमें से कोई भी सीधे संबोधित करता है। C # में टाइप करने के दो तरीके हैं: स्टैटिक टाइप और रन-टाइम टाइप ।

स्थैतिक प्रकार आपके स्रोत कोड में एक चर का है। इसलिए यह एक संकलन-समय की अवधारणा है। यह वह प्रकार है जिसे आप टूलटिप में देखते हैं जब आप अपने विकास के वातावरण में एक चर या संपत्ति पर मंडराते हैं।

आप टाइप करने के लिए स्थैतिक प्रकार लिखकर हेल्पर जेनेरिक विधि प्राप्त कर सकते हैं।

   Type GetStaticType<T>(T x) { return typeof(T); }

रन-टाइम प्रकार मेमोरी में ऑब्जेक्ट का प्रकार है। इसलिए यह एक रन-टाइम अवधारणा है। यह GetType()विधि द्वारा लौटाया गया प्रकार है ।

किसी ऑब्जेक्ट का रन-टाइम प्रकार स्थिर वैरिएबल, प्रॉपर्टी, या विधि के अलग-अलग प्रकार से होता है जो इसे धारण या रिटर्न करता है। उदाहरण के लिए, आपके पास इस तरह का कोड हो सकता है:

object o = "Some string";

वैरिएबल का स्थिर प्रकार है object, लेकिन रन टाइम पर, वेरिएबल के रेफरेंस का प्रकार है string। इसलिए, अगली पंक्ति कंसोल में "System.String" प्रिंट करेगी:

Console.WriteLine(o.GetType()); // prints System.String

लेकिन, यदि आप oअपने विकास के वातावरण में चर पर होवर करते हैं, तो आपको टाइप System.Object(या समतुल्य objectकीवर्ड) दिखाई देगा। आप भी ऊपर से हमारे सहायक समारोह का उपयोग करते हुए देखें:

Console.WriteLine(GetStaticType(o)); // prints System.Object

जैसे मूल्य-प्रकार चर, के लिए int, double, System.Guid, आप जानते हैं कि रन-टाइम प्रकार हमेशा की तरह, स्थिर प्रकार के रूप में ही होगा, क्योंकि मूल्य प्रकार एक अन्य प्रकार के लिए आधार वर्ग के रूप में काम नहीं कर सकते हैं; मूल्य प्रकार इसकी विरासत श्रृंखला में सबसे व्युत्पन्न प्रकार होने की गारंटी है। यह सीलबंद संदर्भ प्रकारों के लिए भी सही है: यदि स्थैतिक प्रकार एक सील संदर्भ प्रकार है, तो रन-टाइम मान या तो उस प्रकार का उदाहरण होना चाहिए या null।

इसके विपरीत, यदि वैरिएबल का स्थिर प्रकार एक अमूर्त प्रकार है, तो यह गारंटी है कि स्थिर प्रकार और रनटाइम प्रकार अलग-अलग होगा।

यह बताने के लिए कि कोड में:

// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));

// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));

// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));

// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));

3
इसलिए variable.getType()रनटाइम प्रकार (दाएं हाथ की ओर का प्रकार) लौटाता है, लेकिन स्थैतिक प्रकार (एक चर के बाएं हाथ की ओर का प्रकार) क्या लौटाता है?
— बार्लोप

@बारलोप जो संकलित समय पर जाना जाता है। आप typeofस्थैतिक प्रकार के लिए रनटाइम पर एक प्रकार की वस्तु प्राप्त करने के लिए उपयोग कर सकते हैं ।
— phoog

हाँ मैं स्थिर प्रकार = संकलन समय प्रकार, और रनटाइम प्रकार = गतिशील प्रकार जानता हूँ। हालांकि चर 'a' के प्रकार को प्राप्त करने के बाद, आप ऐसा नहीं कर सकते typeof(a) यदि आप ऐसा करते हैं तो typeof(int)यह int पर वापस आ जाएगा, लेकिन चर 'a' की जाँच नहीं कर रहा है और आपको 'a' का प्रकार दिखा रहा है। आप कह सकते हैं कि आप स्थिर प्रकार 'a' को दिखाने की आवश्यकता नहीं है, ऐसा हो सकता है, लेकिन तथ्य यह है कि यह इसे नहीं दिखा रहा है। इसलिए मैं यह नहीं देखता कि यहां टाइपोफ का उपयोग कैसे उपयोगी है।
— बार्लोप

4
@barlop आप ऐसा करने के लिए कर सकते हैं ताकि आप के लिए प्रकार की देखरेख कर सकें:Type GetStaticType < T > (T x) { return typeof(T); }
— phoog

1
@ जक्खर जैसा कि आपने देखा होगा, switchअब टाइप टेस्टिंग के लिए पैटर्न का समर्थन करता है (रनटाइम टाइप का, स्टेटिक नहीं)। गेटटाइप () से लौटे मूल्य पर स्विच करने के बजाय, आप सीधे चर पर स्विच करते हैं।
— फोज


16

आमतौर पर, जब तक आप प्रतिबिंब या इंटरफेस के साथ कुछ नहीं कर रहे हैं, तब आपको शायद ही कभी तुलना करने की आवश्यकता होगी। बहरहाल:

यदि आप जानते हैं कि आप किस प्रकार से इसकी तुलना करना चाहते हैं, तो isया asऑपरेटरों का उपयोग करें :

if( unknownObject is TypeIKnow ) { // run code here

asऑपरेटर एक डाली रिटर्न शून्य है कि अगर यह एक अपवाद के बजाय विफल रहता है करता है:

TypeIKnow typed = unknownObject as TypeIKnow;

यदि आप प्रकार नहीं जानते हैं और केवल रनटाइम प्रकार की जानकारी चाहते हैं, तो .Getype () विधि का उपयोग करें:

Type typeInformation = unknownObject.GetType();

C # के नए संस्करणों में, आप isऑपरेटर को उपयोग करने की आवश्यकता के बिना एक चर घोषित करने के लिए उपयोग कर सकते हैं as:

if( unknownObject is TypeIKnow knownObject ) {
    knownObject.SomeMember();
}

पहले आपको ऐसा करना होगा:

TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
    knownObject.SomeMember();
}



3

एक विकल्प एक सहायक विस्तार विधि का उपयोग करने के लिए किया जाएगा:

public static class MyExtensions
{
    public static System.Type Type<T>(this T v)=>typeof(T);
}

var i=0;
console.WriteLine(i.Type().FullName);

0

GetType() तरीका

int n=34;
Console.WriteLine(n.GetType());
string name="Smome";
Console.WriteLine(name.GetType());

0

ऐसा करने का एक आसान तरीका देखें

// Read string from console
        string line = Console.ReadLine(); 
        int valueInt;
        float valueFloat;
        if (int.TryParse(line, out valueInt)) // Try to parse the string as an integer
        {
            Console.Write("This input is of type Integer.");
        }
        else if (float.TryParse(line, out valueFloat)) 
        {
            Console.Write("This input is of type Float.");
        }
        else
        {
            Console.WriteLine("This input is of type string.");
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.