উদাহরণটি কোনও ধরণের কিনা তা পরীক্ষা করে দেখুন


181

cউদাহরণস্বরূপ কিনা তা পরীক্ষা করতে এটি ব্যবহার করে TForm

c.GetType().Name.CompareTo("TForm") == 0

পরম stringহিসাবে ব্যবহার করার পাশাপাশি এটি করার আরও কিছুর নিরাপদ উপায় আছে CompareTo()?


20
আমি অবশ্যই আশা করি আপনি জাভাতে সেভাবে না করেন। জাভা instanceofএবং সি # এর করা isএর আরও ভাল উপায়।
পাওয়ারলর্ড

উত্তর:


410

এখানে বিভিন্ন উত্তরের দুটি পৃথক অর্থ রয়েছে।

আপনি করতে চান তাহলে একটি দৃষ্টান্ত হল কিনা একটি সঠিক টাইপ তারপর

if (c.GetType() == typeof(TForm))

যাবার উপায়

আপনাকে জানতে হবে কিনা চান cএকটি দৃষ্টান্ত হল TForm বা উপশ্রেণী তারপর ব্যবহার is/ as:

if (c is TForm)

অথবা

TForm form = c as TForm;
if (form != null)

আপনি আসলে এই আচরণগুলির মধ্যে কোনটি সম্পর্কে আপনার মনে পরিষ্কার হওয়া উচিত।


7
একটি ছোট নোট: আপনি যদি কাস্টের ফলাফলটি ব্যবহার করতে না চান এবং ব্যবহার করেন তবে "হিসাবে" ব্যবহার করুন।
আভিরাম ফায়ারবার্গার

14
সি # 7 এর সাথে আপনি একত্রিত করতে পারেন isএবং asপ্যাটার্ন মেলানোর সাথে:if (x is TForm tf) {…
রিচার্ড

39
if(c is TFrom)
{
   // Do Stuff
}

বা আপনি যদি এটি cহিসাবে ব্যবহার করার পরিকল্পনা করেন TFormতবে নীচের উদাহরণটি ব্যবহার করুন:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

দ্বিতীয় উদাহরণটি কেবল একবার cটাইপ হয়েছে কিনা তা পরীক্ষা করে দেখার প্রয়োজন TForm। এর মধ্যে যদি আপনি যাচাই করে থাকেন যদি cপ্রকারের মতো কিনা তা দেখুন তবে TFormএটি নিক্ষেপ করুন, সিএলআর অতিরিক্ত পরীক্ষা করে নিচ্ছে । এখানে একটি উল্লেখ আছে

সম্পাদনা করুন: জোন স্কিট থেকে চুরি হয়েছে

আপনি করতে চান নিশ্চিত cহয় TFormএবং কোন ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত TForm, তারপর ব্যবহার

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}

14

হ্যাঁ, "হ'ল মূলশব্দ:

if (c is TForm)
{
    ...
}

এমএসডিএন-তে বিস্তারিত দেখুন: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

কোনও বস্তু প্রদত্ত ধরণের সাথে সামঞ্জস্যপূর্ণ কিনা তা পরীক্ষা করে। উদাহরণস্বরূপ, এটি নির্ধারণ করা যেতে পারে যদি কোনও বস্তুর মতো স্ট্রিং টাইপের সাথে সামঞ্জস্য হয়:


10

এছাড়াও, কিছুটা একই শিরাতে

Type.IsAssignableFrom(Type c)

"সত্য যদি গ এবং বর্তমান টাইপ একই ধরণের প্রতিনিধিত্ব করে, বা যদি বর্তমান টাইপ সি এর উত্তরাধিকারক্রমক্রমের মধ্যে থাকে, বা যদি বর্তমান প্রকারটি ইন্টারফেস যা সি প্রয়োগ করে, বা সি জেনেরিক টাইপ পরামিতি এবং বর্তমান প্রকার হয় গ এর প্রতিবন্ধকতার মধ্যে একটির প্রতিনিধিত্ব করে।

এখান থেকে: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx


এটিও আমার ব্যক্তিগত প্রিয়। typeof(Class).IsAssignableFrom(object.getType())জাভা instanceofঅপারেটরের অনুরূপ ।
SkidRunner

উত্তরাধিকারক্রমক্রমের একই শাখায় না থাকলেও কোনও রূপান্তর অপারেটর উপস্থিত থাকলে এটি কি মিথ্যা দেয়?
পল স্টেলিয়ান

ভাল প্রশ্ন @ পলস্টেলিয়ান। আমি আমার মাথার উপরের দিক থেকে নিশ্চিত নই তবে আমার ধারণা এটি এমন পরিস্থিতিতে কোনও মিথ্যা ফিরিয়ে আনবে। এটি অন্তত আমার প্রত্যাশিত আচরণ হবে। সম্ভবত কোনও অন্তর্নিহিত রূপান্তর উপস্থিত থাকলে এটি সত্য হতে পারে তবে এটি অদ্ভুত।
ব্র্যাড কানিংহাম

যার কাছে ভিজ্যুয়াল স্টুডিও ইনস্টল আছে এটি চেষ্টা করে?
পল স্টেলিয়ান

1
@ পলস্টেলিয়ান - এটি মিথ্যা প্রত্যাবর্তন করে। এটি ডক লিঙ্কটি অনুসরণ করে দেখা যায় এবং পর্যবেক্ষণে কোনও রূপান্তরের উল্লেখ নেই। এটি সম্পর্কে চিন্তা করার আর একটি উপায় হ'ল এমন পরিস্থিতিতে T1.IsAssignableFrom(T2)ফিরে আসেtrueas অপারেটর সেই ধরণের উদাহরণগুলির ভিত্তিতে একটি নন-নাল মান প্রদান করে।
টুলমেকারস্টেভ

9

আপনি যদি টিএফর্ম হিসাবে সি ব্যবহার করতে চান তবে অন্যান্য উত্তরের চেয়ে কিছুটা কমপ্যাক্ট:

if(c is TForm form){
    form.DoStuff();
}


2

অন্যরা যেমন উল্লেখ করেছে, "হ'ল" কীওয়ার্ড। তবে, আপনি যদি পরে এটিকে টাইপ করতে যান তবে, যেমন।

TForm t = (TForm)c;

তারপরে আপনার "হিসাবে" কীওয়ার্ডটি ব্যবহার করা উচিত।

যেমন TForm t = c as TForm.

তারপরে আপনি চেক করতে পারেন

if(t != null)
{
 // put TForm specific stuff here
}

এর সাথে একত্রিত হবেন না কারণ এটি একটি সদৃশ চেক।



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

বা সহজ

bool isValid = c.GetType() == typeof(TForm);

আইএমএইচও: আমি সরাসরি অনুকম্পা এড়াতে চাই (অর্থাত্ ==) অবজেক্ট বা ওরিয়েন্টেড ভাষায় উত্তরাধিকারকে সমর্থন করে যদি না আপনি জানেন যে আপনার নির্দিষ্ট ধরণের উদাহরণস্বরূপ কোনও sealedশ্রেণি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে না । এছাড়াও: একটি টার্নারি অপারেটর রিটার্নিং (স্ট্যাটিক / ধ্রুবক) বুলিয়ান মানগুলি আমাকে বিরক্ত করে, যদি এটি switchবিবৃতি হয় তবে আমি কম বিরক্ত হব ।
SkidRunner
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.