এটার মানে কি?


36

আমি নীচের কোডটি মাঝে মাঝে দেখি এবং এক্সপ্রেশনটি আসলে কী পরীক্ষা করে চলেছে তা সম্পর্কে আমার কোনও ধারণা নেই।

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

উত্তর:


28

এটি কেবলমাত্র সি # 8 এর খালি সম্পত্তির প্যাটার্ন, যার অর্থ মান নেই null। এটি কোনও মান ধরণের বা রেফারেন্সের ধরণের সাথে মেলে। পানাজিওটিস কানভোস মন্তব্যগুলিতে যেমন মন্তব্য করেছেন, value is objectএটি দীর্ঘকাল ধরে সি # তে থাকা ভাল পুরানো চেকের সমান ।

সাধারণত আপনি যদি কোনও সম্পত্তি নির্দিষ্ট করে থাকেন তবে তা মিলবে কি না। এই রহস্যজনক উদাহরণ চিত্রিত করে যে:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

সম্পত্তির নিদর্শনগুলি সর্বোত্তমভাবে কাজ করে এবং switchপ্রকাশের মতো ক্ষেত্রে অন্যান্য নিদর্শনগুলির সাথে তুলনা করার সময় সর্বাধিক স্পষ্ট হয় ।


1
এই ক্ষেত্রে খালি বস্তু মানে কি? খালি স্ট্রিং, সাদা জায়গা?
ওলিগি

3
@ ওলিগি না এটা না sনিঃসন্দেহে নাল না। is {}শর্টহ্যান্ড এর জন্য is objectএবং স্ট্রিংগুলি আপত্তিতে কাস্ট করা যেতে পারে।
পানাজিওটিস কানভোস

6
@ ওলিগি কিভাবে? এটি একটি বৈধ রেফারেন্স তাই এটি মেলে।
ড্যানিয়েল এ হোয়াইট

3
এটি একটি নতুন বিশ্ব যেখানে structs মধ্যে নাল হতে পারে এবং রেফারেন্স নাল হতে পারে না, সুইচ বিবৃতি বিপরীত এবং বিভিন্ন হয় !, !!, ?এবং ??আগে ও পরে বৈশিষ্ট্য ভিন্ন জিনিস মানে। সিনট্যাকটিক চিনি কখন শেষ হবে?
ja72

3
এটি কি হিসাবে একই value != null?
ca9163d9

7

ড্যানিয়েলের উত্তরটি সঠিক হলেও, আমি মনে করি যে আপনি কেন খালি সম্পত্তির প্যাটার্ন ব্যবহার করতে পারেন তা নিয়ে কিছু প্রসঙ্গ যুক্ত করা কার্যকর হতে পারে । এই উদাহরণস্বরূপ নিয়ন্ত্রক পদ্ধতিটি বিবেচনা করুন যা কিছু বৈধতা সম্পন্ন করা দরকার:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

উপরের দিকে, ValidateId()নাল বা একটি উদাহরণ ফিরে আসতে পারে BadObjectRequestResult। যদি প্রাক্তনটিকে ফিরিয়ে দেওয়া হয় তবে বৈধতা সফল হয় এবং এর বাকী অংশে চলে যায় Update। যদি পরবর্তীটি ফিরে আসে is {}তবে সত্য (অর্থাত্ অবশ্যই এর উদাহরণটি BadObjectRequestResultএকটি object), এবং বৈধতা ব্যর্থ হয়।

সুন্দরভাবে, এর মধ্যে আমরা একটি পরিবর্তনশীল নামও সরবরাহ করেছি invalid, যা আমরা অবিলম্বে ফিরে আসতে পারি। তা ছাড়া আমাদের আরও ভার্বোজ কোডের দরকার হয়।

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

একটিতে আরও পঠনযোগ্য বা অন্যটি পাঠকের উপর নির্ভরশীল, খালি সম্পত্তির প্যাটার্নটি ব্যবহার করার একটি উপায় আমি কেবল উপস্থাপন করেছি।


is object invalidis {} invalid
সেক্ষেত্রে কারও

1
@ পানাগিওটিসকানাভস যা এই ক্ষেত্রে কাজ করবে না কারণ একটি রিটার্ন IActionResultপ্রয়োজন (ভাল প্রযুক্তিগতভাবে Task<IActionResult>)। আমরা যদি আপনার স্টাইলের সাথে যাই ifতবে এর একই ফল রয়েছে তবে invalidএটি একটি objectসংকলন হবে না।
কিট

0

আমি মনে করি এটি পরীক্ষা করা উচিত মানটি কোনও ফাঁকা বস্তু কিনা

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