সি #: 'হ'ল মূলশব্দ এবং নোটের জন্য পরীক্ষা করা


287

এটি একটি নির্বোধ প্রশ্ন, তবে আপনি এই কোডটি কোনও নির্দিষ্ট ধরণের কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন ...

if (child is IContainer) { //....

"না" উদাহরণটি যাচাই করার জন্য আরও কি মার্জিত উপায় আছে?

if (!(child is IContainer)) { //A little ugly... silly, yes I know...

//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) { 
if (child aint IContainer) { 
if (child isnotafreaking IContainer) { 

হ্যাঁ, হ্যাঁ ... বোকা প্রশ্ন ....

কোডটি দেখতে কেমন তা নিয়ে কিছু প্রশ্ন রয়েছে কারণ এটি কোনও পদ্ধতির শুরুতে কেবল একটি সাধারণ রিটার্ন।

public void Update(DocumentPart part) {
    part.Update();
    if (!(DocumentPart is IContainer)) { return; }
    foreach(DocumentPart child in ((IContainer)part).Children) {
       //...etc...

105
আমি ব্যক্তিগতভাবে "শিশু isnotafreaking ..." পছন্দ করি। আমি এই কীওয়ার্ডটি সি # 5 তে রাখার জন্য ভোট দিচ্ছি
জোসেফ

আপনি যে পরিস্থিতিটি ব্যবহার করবেন তা জানতে আগ্রহী? এই কোডটির "অন্য" অংশটি দেখতে কেমন এবং আপনি কেবল পরীক্ষাটি উল্টাতে পারবেন না? যদি আপনার কোডটি বলছে "যদি শিশু কোনও আইসনটেনার না হয় তবে ব্যতিক্রমগুলি ছুঁড়ে ফেলুন" বা "যদি শিশু কোনও আইসকটেনার না হয় তবে সম্ভবত এটি আইফু হয় তাই আমি পরবর্তীটি চেষ্টা করব" তবে সেখানে কোনও বর্ণিত অন্য বক্তব্য নেই? আমি সম্ভবত কিছু মিস করছি।
মার্টিন পেক

1
@ মার্টিনপেক, অন্য কোনও ধারা থাকতে পারে না। এই কারণেই আমি এটি অনুসন্ধান করেছি।
জোশুয়া ওয়ালশ

@ মার্টিনপেক এখানে একটি নমুনা দিয়েছেন: if (!(argument is MapsControlViewModel vm)) { return; }- আমি যদি এইটিটি উল্টিয়ে দিতে পারি এবং পুরো বন্ধ পদ্ধতিটি যদি ইফের বন্ধনীগুলির মধ্যে রাখতে পারি তবে আমি পদ্ধতিটির শেষে প্রচুর বন্ধনী বন্ধন সহ ক্রিসমাস-ট্রি কোড পেতে পারি। এটি অনেক কম পাঠযোগ্য।
এভিনিস

সম্ভবত আমাদের সাধারণভাবে যা দরকার তা হল ifnotবিবৃতিগুলি
ডেভ কাজিনো

উত্তর:


301
if(!(child is IContainer))

যেতে একমাত্র অপারেটর (কোনও IsNotঅপারেটর নেই)।

আপনি এটি করতে পারেন এমন একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:

public static bool IsA<T>(this object obj) {
    return obj is T;
}

এবং তারপরে এটি ব্যবহার করুন:

if (!child.IsA<IContainer>())

এবং আপনি আপনার থিম অনুসরণ করতে পারে:

public static bool IsNotAFreaking<T>(this object obj) {
    return !(obj is T);
}

if (child.IsNotAFreaking<IContainer>()) { // ...

আপডেট (ওপি কোড স্নিপেট বিবেচনা):

যেহেতু আপনি আসলে মানটি পরে দিচ্ছেন, আপনি কেবল asপরিবর্তে ব্যবহার করতে পারেন :

public void Update(DocumentPart part) {
    part.Update();
    IContainer containerPart = part as IContainer;
    if(containerPart == null) return;
    foreach(DocumentPart child in containerPart.Children) { // omit the cast.
       //...etc...

1
সি কে: আমি অপারেটরদের অর্থে বোঝাতে চাইছি, IsNotকিছুই নেই।
মেহরদাদ আফশারী

5
হ্যাঁ. আমি মজা করছি যদি এটা স্পষ্ট না হয়।
মেহরদাদ আফশারী

111

আপনি এটি এইভাবে করতে পারেন:

object a = new StreamWriter("c:\\temp\\test.txt");

if (a is TextReader == false)
{
   Console.WriteLine("failed");
}

2
@ ফ্র্যাঙ্ক - হ্যাঁ, মূল শব্দটি একটি বুলিয়ান দেয়, যা আপনি
মিথ্যের সাথে

32
@Frank এটি কাজ করে কারণ isরয়েছে উচ্চতর প্রাধান্য আপেক্ষিক ==। আপনি !x is fযেটি ব্যবহার করতে পারবেন না তার একমাত্র কারণ এটির চেয়ে কম প্রাধান্য রয়েছে !
মেহরদাদ আফশারি 15

আমি এটি পছন্দ করি তবে ভেরিয়েবল প্রবর্তন করার সময় এটি ঠিক কাজ করবে বলে মনে হয় না, যদিও এটি হওয়া উচিত। if (a is TextReader reader == false)"উচিত" কাজ করে, তবে এটি আপনাকে ভ্রিয়েবলটি সত্য পথে ব্যবহার করতে দেয় না এটি বলে যে এটি সম্ভবত আরম্ভ করা হয়নি।
ডেভ কাজিনো

@ ডেভকৌসিনিউ - সাধারণত আপনি যখন পরিচয় করা ভেরিয়েবলটি ব্যবহার করতে চান তখন আপনি টাইপচেক করে একটি ভেরিয়েবলের পরিচয় করিয়ে দিন। আমি নিশ্চিত কিভাবে পরিবর্তনশীল যদি উপকারী হয় typecheck ব্যর্থ হবে নই (দাবিত্যাগ - আমি "প্যাটার্ন ম্যাচিং" বৈশিষ্ট্য এটি উভয় দুর্বল নাম এবং ব্যবহার একটি কোড গন্ধ খারাপ হিসাবে। outপরামিতি)
StingyJack

@ স্টেটিং জ্যাক কিছু প্রকার গণ্ডগোল রয়েছে যেখানে সত্য পথে চলকটিকে অবিচ্ছিন্ন হিসাবে বিবেচনা করা হয়। এমনকি যদি আপনি বলেন if (a is TextReader reader == true)এটি ভেরিয়েবলটি অনির্বাচিত বলে মনে করে।
ডেভ কাজিনো

11

শুধু অন্যটি ব্যবহার করবেন না কেন?

if (child is IContainer)
{
  //
}
else
{
  // Do what you want here
}

এটি ঝরঝরে এটি পরিচিত এবং সহজ?


3
এটিতে কোনও ভুল নেই - এটি কেবল একটি নিটপিক প্রশ্ন। আমি কিছু নির্দিষ্ট ধরণের না হলে অবিলম্বে কোনও ফাংশন থেকে বেরিয়ে যেতে চেয়েছিলাম। আমি এখনই এটি চিরদিনের জন্য করেছি (! (শিশু কিছু হ'ল)) তবে আমি ভেবেছিলাম যে এটির চেয়ে ভাল উপায় আর নেই।
হুগোয়ারে

1
প্রশ্নের নমুনা কোড সহ, এর অর্থ যদি বন্ধনী হয় তবে একটি খালি। এটি কোনও বোধগম্য বিকল্পের মতো শোনায় না।
আনিসেভ

9

আপনার কাছে যেভাবে রয়েছে তা ঠিক আছে তবে "'নয়' উদাহরণটি যাচাই করার আরও সুন্দর উপায় হিসাবে তৈরি করতে আপনি এক্সটেনশন পদ্ধতির একটি সেট তৈরি করতে পারেন।

public static bool Is<T>(this object myObject)
{
    return (myObject is T);
}

public static bool IsNot<T>(this object myObject)
{
    return !(myObject is T);
}

তাহলে আপনি লিখতে পারেন:

if (child.IsNot<IContainer>())
{
    // child is not an IContainer
}

7

এটি এখনও উল্লেখ করা হয়নি। এটি কাজ করে এবং আমি মনে করি এটি ব্যবহারের চেয়ে ভাল দেখাচ্ছে!(child is IContainer)

if (part is IContainer is false)
{
    return;
}

isবাক্য গঠন expr is constant :, যেখানে এক্সপ্রেস মূল্যায়নের জন্য অভিব্যক্তি এবং ধ্রুবক এটির জন্য পরীক্ষার মান।


3
একইভাবে আপনি করতে পারে if (part as IContainer is null)। সত্য যা নিশ্চিত তা নিশ্চিত নয়।
ফ্লাইএন 1179

5

কুশ্রী? আমি একমত নই একমাত্র অন্য উপায় (আমি ব্যক্তিগতভাবে এটি "কৃপণাত্মক" বলে মনে করি):

var obj = child as IContainer;
if(obj == null)
{
   //child "aint" IContainer
}

@ মেহরদাদ - নুল? এটি কাজ করতে সক্ষম করবে, এটি ব্যবহার করা উচিত নয়। এটি একটি কুরুচিপূর্ণ উপায় মাত্র একটি উদাহরণ।
স্টিভিওপওয়েল

@ স্টিভো 3000: হ্যাঁ, তবে আপনার স্পষ্টভাবে উল্লেখ করা উচিত? asধারাটি হ'ল obj as intএকটি সর্বদা একটি সংকলন সময় ত্রুটি।
মেহরদাদ আফশারি

@ মেহরদাদ - সম্মত, বিফ্রি তার পোস্টটি সম্পাদন করতে পারে এটি প্রতিফলিত করতে। আমাদের দেওয়া 'আপত্তি হিসাবে?'
স্টিভিওপওয়েল

@ স্টিভো 3000: তবে আমি মনে করি না যে এটির সাথে কিছু ভুল হয়েছে। আইকনটাইনার মান ধরণের চেয়ে ইন্টারফেসের মতো অনুভব করে। কেবল এটি নির্দেশ করতে চেয়েছিল এটির জন্য মূল্য ধরণের যত্নের প্রয়োজন এবং এটি সর্বদা isফর্মের সরাসরি অনুবাদ নয় ।
মেহরদাদ আফশারী

আপনি যদি বিকল্প হিসাবে করতে পারেন (জেজ == ডিফল্ট (আইকনটাইনার)), যা মান ধরণের এবং রেফারেন্সের ধরণের যত্ন নেবে
জোসেফ

3

isএকটি বুলিয়ান ফলাফলের অপারেটর মূল্যায়ণ, তাই আপনি কিছু করতে পারেন আপনি অন্যথায় একটি bool উপর কাজ করতে সক্ষম হবে। এটিকে অগ্রাহ্য করতে !অপারেটরটি ব্যবহার করুন । আপনি কেবল এই জন্য আলাদা অপারেটর রাখতে চান কেন?


5
এটি আলাদা অপারেটর নয়। আমি ভাবছিলাম যে এমন কোনও কীওয়ার্ড রয়েছে যা আমাকে পেরেনের অতিরিক্ত সেটটি ফেলে দেবে। এটি একটি বড় বাছাই, কিন্তু আমি কৌতূহল ছিল।
হুগোয়ারে

ঠিক আছে আমি বুঝেছি. আপনার উদাহরণগুলি থেকে আমি ধারণা পেয়েছি যে আপনি একটি নতুন, উত্সর্গীকৃত অপারেটরটির সন্ধান করছেন।
ব্রায়ান রাসমুসেন

আমি মনে করি এরকম একটি বিশেষ অপারেটর থাকা খারাপ, কারণ আমাদের এই পদ্ধতিটি থাকবে (যাইহোক যাইহোক এই উত্তরগুলি ব্যাখ্যা করা হবে), এবং যদি আমাদের অন্য কোনও অপশন থাকে তবে একই জিনিস অর্জনের দুটি উপায় রয়েছে, বিভ্রান্তিকর হতে পারে।
বুধীপ

3

এক্সটেনশন পদ্ধতিটি IsNot<T>সিনট্যাক্সটি প্রসারিত করার একটি দুর্দান্ত উপায়। মনে রেখ

var container = child as IContainer;
if(container != null)
{
  // do something w/ contianer
}

ভালো কিছু করার চেয়ে ভাল পারফর্ম করে

if(child is IContainer)
{
  var container = child as IContainer;
  // do something w/ container
}

আপনার ক্ষেত্রে, আপনি পদ্ধতিটি থেকে ফিরে আসার কারণে এটি কোনও বিষয় নয়। অন্য কথায়, টাইপের জন্য চেক এবং তারপরে অবিলম্বে টাইপ রূপান্তর না করতে সাবধান হন।


3

যদিও এটি প্রথম বন্ধনীর সমস্যাটি এড়াতে পারে না, গুগলের মাধ্যমে লোকেরা এখানে আসার জন্য, আপনার বাকী কোডটি আরও কিছুটা পরিষ্কার করে তুলতে আরও নতুন সিনট্যাক্স উপস্থিত রয়েছে (সি # 7 হিসাবে):

if (!(DocumentPart is IContainer container)) { return; }
foreach(DocumentPart child in container.Children) {
    ...

এটি ডাবল-কাস্ট, নাল-চেক এবং এলোমেলোভাবে স্কোপগুলিতে ভেরিয়েবল পাওয়া যায়।


2

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

MyClass mc = foo as MyClass;
if ( mc == null ) { }
else {}

2

C # এর 9 (.NET 5 রিলিজ করা হবে) লজিক্যাল নিদর্শন অন্তর্ভুক্ত করা হবে and, orএবং not, যা আমাদের আরো এইরূপ সূচারূভাবে এই লেখার অনুমতি দেয়:

if (child is not IContainer) { ... }

তেমনি, এই প্যাটার্নটি নাল পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে:

if (child is not null) { ... }

এই পরিবর্তনটি অনুসরণ করে আপনি গিথুব ইস্যুতে আরও বিশদ জানতে পারেন ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.