আমি কীভাবে সি # তে ভেরিয়েবলের ডেটা টাইপ পেতে পারি?


96

কিছু ভেরিয়েবল কী ধরণের ডেটা টাইপ করে তা আমি কীভাবে জানতে পারি? (যেমন, আন্ত, স্ট্রিং, চর ইত্যাদি)

আমার এখন এমন কিছু আছে:

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
— জামিয়াক

এটি "তথ্য প্রকারের সন্ধান করুন" দ্বারা আপনি কী বোঝাতে চান তা অস্পষ্ট। সাধারণত, উত্তরটি "আপনি কেবল শ্রেণীর সদস্যের স্বাক্ষরটি দেখেন এবং প্রকারটি সেখানে একটি স্পষ্ট উপায়ে বর্ণিত হয়"। আপনার উদ্দেশ্য কি রান সময়টিতে ক্লাসের সদস্যদের পরীক্ষা করা?
— উইক্টর জাচলা

4
বিষয়বহির্ভূত, তবে আপনি এখানে যা লিখেছেন তা সি #: class Person { public string Name { get; set; } }বা এর সাথে আরও ভালভাবে এইভাবে লেখা হয়েছে class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }। সম্পত্তি
— স্টিভ বি

4
জামিয়েক ঠিক বলেছেন। স্ট্যাটিক টাইপিং মানে ঘোষণার অর্থ আপনার ধরণ চিরকাল স্থায়ী হয়। আপনার ভেরিয়েবল এন কেবলমাত্র আপনি ঘোষিত ধরণের বা উত্তরাধিকারসূত্রে প্রকারের হতে পারে। আপনার সুনির্দিষ্ট ক্ষেত্রে আপনি কোন প্রকার প্রদর্শন করতে পছন্দ করেছেন, এটি এমন এক ধরণের যা আপনি উত্তরাধিকার সূত্রে গ্রহণ করতে পারবেন না, সুতরাং এন কেবলমাত্র একটি ইনট হতে পারে।
— Ksempac

উত্তর:


124

একটি গুরুত্বপূর্ণ এবং সূক্ষ্ম ইস্যু রয়েছে যেগুলির কেউই সরাসরি সম্বোধন করে না। সি # তে টাইপ বিবেচনা করার দুটি উপায় রয়েছে: স্ট্যাটিক টাইপ এবং রান-টাইম টাইপ ।

স্ট্যাটিক টাইপ হ'ল আপনার সোর্স কোডে ভেরিয়েবলের প্রকার। সুতরাং এটি একটি সংকলন-সময় ধারণা। আপনি যখন আপনার বিকাশের পরিবেশে কোনও পরিবর্তনশীল বা সম্পত্তির উপরে ঘুরে দেখেন তখন এটি এমনই একটি সরঞ্জাম যা আপনি সরঞ্জামদণ্ডে দেখেন।

টাইপ অনুমানটি এটির যত্ন নেওয়ার জন্য আপনি সহায়ক জেনেরিক পদ্ধতি লিখে স্ট্যাটিক প্রকারটি অর্জন করতে পারেন:

   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, আপনি কি জানেন যে run সময় টাইপ সবসময় স্ট্যাটিক টাইপ একই হবে যেমন কারণ মান ধরনের আরেক ধরনের জন্য বেস শ্রেণী হিসেবে পরিবেশন করা যাবে না; মান প্রকারটি তার উত্তরাধিকার শৃঙ্খলে সর্বাধিক উত্স প্রাপ্ত গ্যারান্টিযুক্ত। এটি সিলযুক্ত রেফারেন্স ধরণের ক্ষেত্রেও সত্য: যদি স্ট্যাটিক প্রকারটি সিলযুক্ত রেফারেন্স টাইপ হয় তবে রান-টাইম মানটি অবশ্যই সেই ধরণের উদাহরণ হতে পারে বা 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));

4
সুতরাং variable.getType()রানটাইম টাইপ (ডান হাতের ধরণের প্রকার) প্রদান করে, তবে স্থির প্রকারটি (একটি ভেরিয়েবলের বাম হাতের প্রকার) কী দেয়?
— বার্লোপ

সংকলনের সময় জানা যায় এমন বারব্লুপ। typeofস্ট্যাটিক টাইপের জন্য রানটাইমে কোনও টাইপ অবজেক্ট পেতে আপনি ব্যবহার করতে পারেন ।
— ফুগ

হ্যাঁ আমি স্থিতিশীল টাইপ = সংকলন টাইম টাইপ, এবং রানটাইম টাইপ = ডায়নামিক টাইপ জানি। ভেরিয়েবলের 'এ' ধরণের ধরণটি পাওয়া গেলেও আপনি এটি করতে পারবেন না typeof(a) যদি typeof(int)এটি পূর্বে ফিরে আসবে, তবে 'ক' ভেরিয়েবলটি পরীক্ষা করে দেখছে না এবং আপনাকে 'এ' টাইপ দেখাচ্ছে না আপনি বলতে পারেন যে আপনি স্থিতিশীল ধরণের 'ক' প্রদর্শন করার দরকার নেই, এটি হতে পারে তবে সত্যটি এটি এটি দেখায় না। সুতরাং আমি এখানে টাইপফোর ব্যবহার কীভাবে কার্যকর তা দেখছি না।
— বার্লপ

4
@ বার্লপ আপনি এটি করতে পারেন টাইপ অনুমানটি আপনার জন্য এটি যত্ন নিতে:Type GetStaticType < T > (T x) { return typeof(T); }
— ফগ

4
@ জ্যাকৌড় যেমন আপনি লক্ষ্য করেছেন, switchএখন টাইপ টেস্টিংয়ের জন্য প্যাটার্ন ম্যাচিং সমর্থন করে (রানটাইম টাইপের, স্ট্যাটিক নয়)। গেটটাইপ () থেকে প্রত্যাবর্তিত মানটি পরিবর্তন করার পরিবর্তে আপনি সরাসরি চলকটি স্যুইচ করুন।
— ফুগ

19

এটা খুবই সাধারণ

variable.GetType().Name

এটি আপনার ভেরিয়েবলের ডেটাটাইপ ফিরিয়ে দেবে


16

সাধারণভাবে বলতে গেলে, আপনি প্রতিচ্ছবি বা ইন্টারফেসের সাহায্যে কিছু করছেন না যদি না আপনি ধরণের তুলনা খুব কমই প্রয়োজন। তবুও:

আপনি টাইপ জানেন তাহলে আপনার সাথে তুলনা করার জন্য, ব্যবহার চান isবা asঅপারেটরদের:

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

asঅপারেটর একটি ঢালাই নাল ফেরৎ যে এটি একটি ব্যতিক্রম বদলে ব্যর্থ সঞ্চালিত:

TypeIKnow typed = unknownObject as TypeIKnow;

আপনি যদি প্রকারটি জানেন না এবং কেবল রানটাইম টাইপের তথ্য চান তবে .GetType () পদ্ধতিটি ব্যবহার করুন:

Type typeInformation = unknownObject.GetType();

সি # এর নতুন সংস্করণগুলিতে আপনি 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.");
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.