Type t = typeof(obj1);
if (t == typeof(int))
// Some code here
এটি একটি ত্রুটি। সি # তে টাইপফোর অপারেটর কেবল প্রকারের নাম নিতে পারে, বস্তু নয়।
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()
একটি নুলারফেরান এক্সেপশন নিক্ষেপ করবে। সুতরাং এটি সঠিকভাবে কাজ করতে, আপনি এটি করতে চাই:
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
। এইভাবে, সিএলআর কেবল একবারের জন্য বস্তুর প্রকার পরীক্ষা করে এবং তারপরে আমাদের কেবল একটি নাল চেক করা দরকার যা আরও দক্ষ which
তবে সাবধান: অনেক লোক এর ফাঁদে পড়ে as
। যেহেতু এটি ব্যতিক্রম ছুঁড়ে না ফেলে, কিছু লোক এটিকে "নিরাপদ" কাস্ট হিসাবে ভাবেন এবং তারা এটিকে একচেটিয়াভাবে ব্যবহার করেন, নিয়মিত কাস্টকে বাদ দেন। এটি এর মতো ত্রুটি বাড়ে:
(o as Animal).Speak();
এই ক্ষেত্রে, বিকাশকারী স্পষ্টভাবে ধরে নিচ্ছেন যে o
এটি সর্বদা একটি হবে Animal
এবং যতক্ষণ না তাদের অনুমান সঠিক হয় ততক্ষণ সবকিছু ঠিকঠাক কাজ করে। তবে যদি তারা ভুল হয়, তবে তারা এখানে যা শেষ করবে তা হ'ল একটি NullReferenceException
। নিয়মিত castালাইয়ের সাথে তারা 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
।
যদি আপনাকে কোনও নির্দিষ্ট ধরণের উদাহরণ হিসাবে একটি অবজেক্টের চিকিত্সা করা প্রয়োজন এবং অবজেক্টটি সেই ধরণের হয় বলে মনে করা হয়, তবে নিয়মিত castালাই ব্যবহার করুন।
as
!