ভেরিয়েবলের ধরণ মেলে কিনা তা পরীক্ষা করতে হবে কোনও ভেরিয়েবলের মধ্যে সংরক্ষণ করা টাইপ করুন


97
User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

কিছু পরিবর্তনশীল এভাবে কিছু ধরণের হয় তবে আমি কীভাবে পরীক্ষা করব?

উত্তর:


197

অন্যান্য উত্তরগুলির মধ্যে উল্লেখযোগ্য বাদ রয়েছে।

isঅপারেটর নেই না পরীক্ষা যদি প্রতীক এর রানটাইম ধরনের ঠিক প্রদত্ত টাইপ; বরং এটি রানটাইম টাইপ প্রদত্ত প্রকারের সাথে সামঞ্জস্যপূর্ণ কিনা তা পরীক্ষা করে দেখুন :

class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.

কিন্তু টাইপ জন্য চেক পরিচয় জন্য প্রতিফলন চেক সঙ্গে পরিচয় , না সামঞ্জস্য

bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal

or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an 

যদি এটি আপনি না চান তবে আপনি সম্ভবত ইসসাইনেবলফর্মটি চান:

bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.

or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A 

4
এখানে প্রদর্শিত চূড়ান্ত পদ্ধতির কাজ করার সময় এটি অকারণে ভার্জোজ। typeof(Animal).IsInstanceOfType(x)এর চেয়ে সংক্ষিপ্ত এবং আরও সোজা typeof(Animal).IsAssignableFrom(x.GetType());(এবং আপনি যদি পরবর্তীকালের ব্যবহার করেন তবে পুনঃভাগটি পূর্বের ব্যবহারের পরামর্শ দিবে)।
মার্ক অ্যামেরি

স্পষ্টকরণ: মূল প্রশ্নের উত্তর দিতে, বিকল্পের tজন্য typeof(Animal)। তাই মার্কের উন্নত রূপটি হয়ে যায় t.IsInstanceOfType(x)
টুলমেকারস্টেভ

13

GetType()প্রতিটি একক কাঠামোর প্রকারে বিদ্যমান, কারণ এটি বেস objectধরণের উপর সংজ্ঞায়িত করা হয় । সুতরাং, নিজেই টাইপ নির্বিশেষে, আপনি অন্তর্নিহিতটি ফিরিয়ে দিতে এটি ব্যবহার করতে পারেনType

সুতরাং, আপনাকে যা করতে হবে তা হ'ল:

u.GetType() == t

4
প্রকৃতপক্ষে এরিকের উত্তর সহায়ক এবং সমস্ত, তবে মূল প্রশ্নে বর্ণিত "u is t" পদ্ধতিতে কোনও অজানা টাইপের সাথে কীভাবে পরীক্ষা করা যায় তার প্রকৃত প্রশ্নের উত্তর দেয় না এবং আপনারও হয়।
ড্যানিয়েল

@ ড্যানিয়েল - ঠিক না আপনি টি এর সাবক্লাস বাদ দিতে চাইলে ডেভের উত্তরটি সঠিক । এরিকের উত্তর বেশিরভাগ ক্ষেত্রে কী করা উচিত তা ব্যাখ্যা করে; এটি "টি" কোথায় লাগাতে হবে তার স্পষ্টতা অনুপস্থিত। আমি সেখানে একটি মন্তব্য যুক্ত করব।
টুলমেকারস্টেভ

10

আপনার উদাহরণের ধরণটি শ্রেণীর ধরণের সমান কিনা তা আপনাকে দেখতে হবে। উদাহরণটির ধরণটি পেতে আপনি GetType()পদ্ধতিটি ব্যবহার করেন :

 u.GetType().Equals(t);

বা

 u.GetType.Equals(typeof(User));

এটা করা উচিত। অবশ্যই আপনি যদি পছন্দ করেন তবে আপনার তুলনা করতে '==' ব্যবহার করতে পারেন।


+1 তবে দ্বিতীয় চয়েজ পছন্দ করুন। u.GetType.Equals(typeof(User));
ওমর

এটি == ব্যবহার করার চেয়ে কম সুরক্ষিত হওয়ার একটি কারণ হ'ল যদি গেটটাইপ () কোনওভাবে শূন্য হয় - এটি নিক্ষেপ করবে।
ডেভ বিশ

4
@ ফিউক্স, হ্যাঁ আমার কাছে, আমি মনে করি এটি টাইপফুলটি ইনলাইন থাকলে কোডটি পড়া সহজ করে তোলে, এ কারণেই আমি এটি পোস্ট করেছি, যদিও ওপিএসের উদাহরণে তার ইতিমধ্যে একটি পরিবর্তনশীল tরয়েছে যা টাইপটি ধারণ করে।
স্যাম হোল্ডার

@ ডেভবিশ যদি গেটটাইপ নালাগুলি ফিরে আসে তবে আমি চিন্তিত হব যে প্রচুর জিনিস নিক্ষেপ করা শুরু হবে ... তবে কথাটি বিবেচনা করুন, আপনি অবশ্যই ঠিক আছেন
স্যাম হোল্ডার

@ সামহোল্ডার হ্যাঁ - একমাত্র পরিস্থিতি এটি ঘটবে, যদি কেউ কোনও বেস টাইপকে ওভাররড করে এবং কোনওভাবে প্রয়োগ বাস্তবায়িত করে। এটি অবশ্যই অদ্ভুত হবে।
ডেভ বিশ

4

কোনও বস্তু লেখার পরিবর্তে প্রদত্ত প্রকারের ভেরিয়েবলের সাথে সামঞ্জস্যপূর্ণ কিনা তা পরীক্ষা করতে

u is t

আপনার লেখা উচিত

typeof(t).IsInstanceOfType(u)

4
'ইউটি টি' সিনট্যাক্স বনাম আরও ভার্বোজ সিনট্যাক্সের সুবিধা কী?
কাইল হামফিল্ড

@ কাইলহামফিল্ড যদি আপনার টাইপ ফু থাকে; অবজেক্ট এ; আপনি "এ ইজ ফু" লিখতে পারবেন না, তবে আপনি foo.isInstanceOfType (A) লিখতে পারেন
তৈমুর নুরিয়াসভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.