سؤال

هناك نوعان من غريب المشغلين في C#:

إذا فهمت هذا حق هذه الشركات يمكن أن تستخدم في الأنواع التي كنت ترغب في استخدامها بدلا من تعبير منطقي و حيث لا تريد أن توفر التحويل الضمني إلى bool.

دعونا نقول لدي الفئة التالية:

    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)

ومع ذلك كل الأمثلة أعلاه فقط صحيح المشغل يتم تنفيذها.فما هي كاذبة المشغل في C# ؟

ملاحظة:أكثر الأمثلة التي يمكن العثور عليها هنا, هنا و هنا.

هل كانت مفيدة؟

المحلول

يمكنك استخدامه لتجاوز && و || المشغلين.

على && و || مشغلي لا يمكن تجاوزها, ولكن إذا تجاوز |, &, true و false في الطريقة الصحيحة المترجم الاتصال | و & عندما تكتب || و &&.

على سبيل المثال, أنظر إلى هذا الرمز (من http://ayende.com/blog/1574/nhibernate-criteria-api-operator-overloading - حيث اكتشفت هذه خدعة ؛ النسخة المؤرشفة بواسطة @BiggsTRC):

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;
}

ومن الواضح أن هذا هو أحد الآثار الجانبية وليس الطريقة التي يعتزم استخدامها ، ولكن من المفيد.

نصائح أخرى

Shog9 الجرد:شكرا على إجاباتك.هذه الأجوبة أشار لي إلى ستيف Eichert المادة و أشارت لي msdn:

العملية x & y& تقييم T. كاذبة(x) ?x :T.&(x, y) ، حيث ت كاذبة(x) هو الاحتجاج المشغل كاذبة أعلن في تي و تي&(x, y) هو الاحتجاج المشغل &.وبعبارة أخرى, x هو أول تقييم مشغل كاذبة هو الاحتجاج على نتيجة لتحديد ما إذا كان x هو بالتأكيد كاذبة.ثم إذا كان x هو بالتأكيد كاذبة ، نتيجة العملية هي القيمة المحسوبة سابقا على x.وإلا y تقييم و اختيار المشغل & تحتج على القيمة المحسوبة سابقا على x و قيمة المحسوبة y أن تنتج نتيجة العملية.

الصفحة رابط http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx يقول ما كانوا ، وهو طريقة التعامل مع nullable bools قبل nullable أنواع قيمة أدخلت.

أعتقد في الوقت الحاضر أنهم جيد لنفس النوع من الاشياء مثل ArrayList - أيلا شيء على الإطلاق.

AFAIK سيكون المستخدمة في اختبار كاذبة ، مثل عندما && المشغل يأتي دور.تذكر && قصيرة الدوائر ، حتى في التعبير

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

mFalse.false() ويسمى عند عودته true التعبير هو تخفيضها إلى الدعوة إلى 'mFalse.صحيح()' (التي ينبغي أن ثم العودة false, أو سوف تحصل أشياء غريبة).

لاحظ أنه يجب تنفيذ & المشغل من أجل هذا التعبير ترجمة, حيث انها تستخدم إذا mFalse.false() يعود false.

ويبدو من قراءة المقال الذي يرتبط كان للسماح nullable منطقية أنواع قبل Nullable (أيint؟, منطقي?, .... الخ) النوع introducted في لغة C#2.وبالتالي يمكنك تخزين داخلية قيمة تبين ما إذا كانت القيمة true أو false أو باطل ، أيفي المثال الخاص بك >0 صحيح ، <0 كاذبة ==0 null, ومن ثم الحصول على SQL نمط null دلالات.سيكون لديك أيضا إلى تنفيذ .IsNull الأسلوب أو الخاصية في أن البطلان يمكن التحقق بشكل صريح.

مقارنة SQL, تخيل طاولة مع 3 صفوف مع قيمة فو تعيين إلى true ، 3 صفوف مع قيمة فو تعيين إلى false و 3 صفوف مع قيمة فو تعيين إلى null.

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

هذا 'باطل' جملة قد equivilent التعليمات البرمجية في فئة .IsNull().

LINQ يجعل المقارنة إلى C# حتى أكثر وضوحا:-

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

تخيل أن MyTypeEnumberable لديها بالضبط نفس محتويات قاعدة البيانات ، أي3 القيم يساوي صحيح ، 3 القيم يساوي كاذبة و 3 قيم يساوي null.في هذه الحالة totalCount تقييم إلى 6 في هذه الحالة.ومع ذلك إذا تم إعادة كتابة التعليمات البرمجية كما يلي:-

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

ثم totalCount تقييم إلى 9.

على DBNull المثال المذكور في ربط المقالة MSDN على الباطل مشغل يوضح فئة في BCL التي لديها نفس السلوك.

في الواقع فإن الاستنتاج هو يجب عدم استخدام هذا إلا إذا كنت متأكدا تماما أنك تريد هذا النوع من السلوك ، فمن الأفضل أن مجرد استخدام أبسط بكثير nullable الجملة!!

تحديث: لقد لاحظت أنك تحتاج إلى يدويا تجاوز منطق مشغلي !, || و && أن يجعل هذا العمل بشكل صحيح.أعتقد كاذبة مشغل يغذي هذه العوامل المنطقية ، أيمشيرا إلى الحقيقة زيف أو 'وإلا'.كما لوحظ في تعليق آخر !× لن تعمل قبالة الخفافيش;عليك أن الزائد !.غرابة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top