সি # তে থাকা মিথ্যা অপারেটর কীসের জন্য ভাল?


107

সি # তে দুটি অদ্ভুত অপারেটর রয়েছে:

আমি যদি এই অধিকারটি বুঝতে পারি তবে এই অপারেটরগুলিকে এমন ধরণের ব্যবহার করা যেতে পারে যা আমি বুলিয়ান এক্সপ্রেশনের পরিবর্তে ব্যবহার করতে চাই এবং যেখানে আমি বুলকে অন্তর্নিহিত রূপান্তর সরবরাহ করতে চাই না।

ধরা যাক আমার নিম্নলিখিত ক্লাস রয়েছে:

    public class MyType
    {
        public readonly int Value;

        public MyType(int value)
        {
            Value = value;
        }

        public static bool operator true (MyType mt)
        {
            return  mt.Value > 0;
        }

        public static bool operator false (MyType mt)
        {
            return  mt.Value < 0;
        }

    }

সুতরাং আমি নিম্নলিখিত কোডটি লিখতে পারি:

    MyType mTrue = new MyType(100);
    MyType mFalse = new MyType(-100);
    MyType mDontKnow = new MyType(0);

    if (mTrue)
    {
         // Do something.
    }

    while (mFalse)
    {
        // Do something else.
    }

    do
    {
        // Another code comes here.
    } while (mDontKnow)

তবে উপরের সমস্ত উদাহরণের জন্য কেবলমাত্র সত্য অপারেটর কার্যকর করা হয়। তাহলে সি # এর ভুয়া অপারেটর কীসের জন্য ভাল?

দ্রষ্টব্য: আরও উদাহরণ এখানে , এখানে এবং এখানে পাওয়া যাবে


আধুনিক দস্তাবেজগুলি ডকস.মাইক্রোসফট /en-us/dotnet/csharp/language-references/ … এ পাওয়া যাবে । দস্তাবেজগুলি পরামর্শ দেয় যে এই অপারেটরটিকে আর কোনও সি # ২.০ যুক্ত করার কারণে যুক্ত করার কোনও কারণ নেই ul
মার্ক

উত্তর:


65

আপনি ওভাররাইড করতে এটি ব্যবহার করতে পারেন &&এবং ||অপারেটর।

&&এবং ||অপারেটরদের উপেক্ষিত হতে পারে না, কিন্তু যদি আপনি ওভাররাইড |, &, trueএবং falseঠিক ঠিক ভাবে কম্পাইলার ডাকব |এবং &আপনি লিখতে যখন ||এবং &&

উদাহরণস্বরূপ, এই কোডটি দেখুন ( http://ayende.com/blog/1574/nhibernate-critedia-api-operator-overloading - যেখানে আমি এই কৌশল সম্পর্কে জানতে পেরেছি; @ বিগসটিআরসি দ্বারা সংরক্ষণাগারিত সংস্করণ ):

public static AbstractCriterion operator &(AbstractCriterion lhs, AbstractCriterion rhs)
{
       return new AndExpression(lhs, rhs);
}

public static AbstractCriterion operator |(AbstractCriterion lhs, AbstractCriterion rhs)
{
       return new OrExpression(lhs, rhs);
}

public static bool operator false(AbstractCriterion criteria)
{
       return false;
}
public static bool operator true(AbstractCriterion criteria)
{
       return false;
}

এটি স্পষ্টতই একটি পার্শ্ব প্রতিক্রিয়া এবং এটি যেভাবে ব্যবহার করা হবে তা নয়, তবে এটি কার্যকর।


আপনার লিঙ্কটি 404 you আপনি কীভাবে এটি সম্পাদনা করতে চান তা নিশ্চিত নয়, তাই আমি এটি রেখে দিয়েছি।
user7116

আমি একটি সংরক্ষণাগারযুক্ত অনুলিপি সহ ইউআরএল আপডেট করেছি যাতে এটি এখনও পড়তে পারে।
আইএএমটিমকুরি

25

শোগ 9 এবং নীর: আপনার উত্তরগুলির জন্য ধন্যবাদ। এই উত্তরগুলি আমাকে স্টিভ আইচার্ট নিবন্ধের দিকে ইঙ্গিত করেছিল এবং এটি আমাকে এমএসডিএন-তে নির্দেশ করেছিল :

অপারেশন এক্স ও অ্যান্ড ওয়াই টি টিফালস (এক্স) হিসাবে মূল্যায়ন করা হয়? x: টি। ও (এক্স, ওয়াই), যেখানে টি.ফালস (এক্স) অপারেটরের একটি টি-তে ঘোষিত মিথ্যা, এবং টি এবং (x, y) নির্বাচিত অপারেটর & এর একটি অনুরোধ। অন্য কথায়, এক্সকে প্রথমে মূল্যায়ন করা হয় এবং এক্স স্পষ্টভাবে মিথ্যা কিনা তা নির্ধারণের জন্য ফলটিতে অপারেটর মিথ্যা প্রার্থনা করা হয়। তারপরে, x যদি অবশ্যই মিথ্যা হয় তবে অপারেশনের ফলাফলটি x এর জন্য পূর্বে গণনা করা মান is অন্যথায়, y এর মূল্যায়ন করা হয়, এবং নির্বাচিত অপারেটর & কে x এর জন্য পূর্বে গণনা করা মান এবং ক্রিয়াকলাপের ফলাফলের জন্য y এর জন্য গণনা করা মানটিতে অনুরোধ করা হয়।


আমি ভাবছি কেন তারা এর (!T.true(x)) ? x : T.&(x, y)পরিবর্তে যুক্তি ব্যবহার করতে পছন্দ করেন নি ।
ডেস নের্গার

14

আপনি যে পৃষ্ঠাটি http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx এর সাথে লিঙ্ক করেছেন সে পৃষ্ঠায় তারা কী বলেছিল, যা মূল্যহীন মান প্রকারের প্রবর্তনের আগে নল-বুলগুলি পরিচালনা করার একটি উপায় ছিল।

আমার ধারণা আজকাল তারা অ্যারেলিস্টের মতো একই ধরণের স্টাফের জন্য ভাল - অর্থাত্ কিছুই নয়।


7

আফাইক, এটি মিথ্যা পরীক্ষার জন্য ব্যবহার করা হবে যেমন &&অপারেটর খেলায় আসে। মনে রাখবেন, && শর্ট সার্কিট তাই অভিব্যক্তিতে

if ( mFalse && mTrue) 
{
   // ... something
}

mFalse.false()বলা হয়, এবং ফিরে আসার trueপরে অভিব্যক্তিটি 'mFalse.true ()' (যা তারপরে ফিরে আসা উচিত false, বা বিষয়গুলি অদ্ভুত হয়ে উঠবে) এর কল হয়ে যায়।

মনে রাখবেন আপনি বাস্তবায়ন করতে হবে &, কম্পাইল করার যে প্রকাশের জন্য অনুক্রমে অপারেটর যেহেতু এটি যদি ব্যবহার করা হয়ে mFalse.false()আয় false


3

আপনি যে এমএসডিএন নিবন্ধটির সাথে লিঙ্ক করেছেন সেটি থেকে এটি প্রতীয়মান হয়েছে যে নুলাবল (অর্থাত্? ই? বুল?, ইত্যাদি) টাইপ সি # 2-তে ভাষার প্রবর্তনের পূর্বে নুলযোগ্য বুলিয়ান ধরণের জন্য অনুমতি দেওয়ার জন্য সরবরাহ করা হয়েছিল। সুতরাং আপনি একটি অভ্যন্তরীণ মান সংরক্ষণ করবেন যা নির্দেশ করে যে মানটি সত্য বা মিথ্যা বা নাল, উদাহরণস্বরূপ আপনার উদাহরণে> 0 সত্যের জন্য, 0 0 মিথ্যা এবং == 0 নলের জন্য, এবং তারপরে আপনি এসকিউএল-স্টাইলের নাল শব্দার্থবিজ্ঞান পাবেন। আপনাকে কোনও .Is নাল পদ্ধতি বা সম্পত্তি প্রয়োগ করতে হবে যাতে নালিশতা পরিষ্কারভাবে পরীক্ষা করা যায়।

এসকিউএলের সাথে তুলনা করে, একটি টেবিলের টেবিলটি কল করুন যার সাথে 3 টি সারি মান Foo সত্য হিসাবে সেট হয়, 3 সারি মান Foo টি মিথ্যাতে সেট করা হয় এবং 3 টি সারি মান Foo সেট করে বাতিল হবে।

SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE
6

সমস্ত সারি গণনা করার জন্য আপনাকে নিম্নলিখিতগুলি করতে হবে: -

SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE OR Foo IS NULL
9

এই 'ইস নল' সিন্টেক্সে আপনার ক্লাসে .IsNull () হিসাবে সামঞ্জস্যপূর্ণ কোড থাকবে।

লিনিকিউ সি # এর সাথে তুলনা আরও পরিষ্কার করে তোলে: -

int totalCount = (from s in MyTypeEnumerable
                 where s || !s
                 select s).Count();

MyTypeEnumberable এর ডাটাবেসের ঠিক একই বিষয়বস্তু রয়েছে অর্থাত সত্যের সমান 3 টি মান, মিথ্যের সমান 3 টি মান এবং নলের সমান 3 টি মান values এই ক্ষেত্রে টোটকাউন্ট এই ক্ষেত্রে 6 টি মূল্যায়ন করবে। তবে, যদি আমরা কোডটি পুনরায় লিখে রাখি: -

int totalCount = (from s in MyTypeEnumerable
                 where s || !s || s.IsNull()
                 select s).Count();

তারপরে টোটকাউন্টটি 9 এ মূল্যায়ন করবে।

ভুয়া অপারেটর সম্পর্কিত লিঙ্কযুক্ত এমএসডিএন নিবন্ধে প্রদত্ত ডিবিএনল উদাহরণটি ছাত্রলীগের এমন একটি শ্রেণি প্রদর্শন করে যা এর সঠিক আচরণ করে।

বাস্তবে এই উপসংহারটি হ'ল যদি আপনি এই ধরণের আচরণটি সম্পূর্ণরূপে নিশ্চিত না হন তবে আপনার এটি ব্যবহার করা উচিত নয়, কেবলমাত্র আরও সহজ নলাবদ্ধ সিনট্যাক্স ব্যবহার করা ভাল better

আপডেট: আমি সবেমাত্র লক্ষ্য করেছি যে আপনাকে লজিক অপারেটরগুলিকে ম্যানুয়ালি ওভাররাইড করতে হবে !, || এবং && এ কাজটি সঠিকভাবে করা। আমি বিশ্বাস করি যে মিথ্যা অপারেটর এই লজিকাল অপারেটরগুলিতে ফিড দেয়, অর্থাত সত্য, মিথ্যা বা 'অন্যথায়' নির্দেশ করে। অন্য মন্তব্যে যেমন উল্লেখ করা হয়েছে! X ব্যাট থেকে কাজ করবে না; আপনাকে ওভারলোড করতে হবে! Weirdness!

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