سؤال

هل من الممكن استخدام المشغل معًا بأي طريقة ?? والمشغل && في الحالة التالية:

bool? Any
{
   get
   {
      var any = this.ViewState["any"] as bool?;
      return any.HasValue ? any.Value && this.SomeBool : any;
   }
}

هذا يعني التالي:

  • إذا any هو فارغ بعد ذلك this.Any.HasValue إرجاع false
  • إذا any له قيمة ، ثم يعيد القيمة بالنظر إلى خاصية منطقية أخرى ، أي Any && SomeBool
هل كانت مفيدة؟

المحلول

أتساءل لماذا لم يقترح أحد حتى الآن:

bool? any = this.ViewState["any"] as bool?;
return any & this.SomeBool;

هذا يعود

  • null إذا any هو لاغ ، بغض النظر عن قيمة this.SomeBool هو؛
  • true إذا كان كل من any و this.SomeBool صحيحة؛ و
  • false إذا any ليس فارغا ، و this.SomeBool هو زائف.

نصائح أخرى

لأنك تريد العودة null في حالة وجود المصدر null, ، لا أعتقد ?? سوف تساعدك على كتابة هذا أي أقصر أو أكثر وضوحا.

هل هذا ما تقصده؟

bool? Any 
{ 
   get 
   { 
      return ((this.ViewState["any"] as bool?) ?? false) && this.SomeBool;
   } 
} 

لقد تركت قيمة الإرجاع كـ BOOL؟ ولكن يبدو أنه يمكن تغييره إلى منطق فقط.

تم اختبار هذا مثل هذا:

class Program
{
    private static readonly Dictionary<string, object> ViewState = new Dictionary<string, object>();
    private static bool SomeBool;

    static void Main(string[] args)
    {
        ViewState["any"] = (bool?)null; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)null; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = false; Console.WriteLine(Any);
        Console.ReadLine();
    }

    static bool? Any
    {
        get
        {
            return ((ViewState["any"] as bool?) ?? false) && SomeBool;
        }
    }
}

الذي يعود

False
False
True
False
False
False

السلوك هنا ليس هو نفسه تمامًا كما يجب إرجاع الأصل مثل NULL لحالات الاختبار 1 و 4 ليكون متطابقًا. ولكن ربما هذا السلوك غير مطلوب؟

أعتقد أن ما تحاول القيام به هو:

return any ?? (any.Value && this.SomeBool) ? true : new Nullable<bool>();

ومع ذلك ، أعتقد في مثل هذه الحالات ، من المحتمل أن يكون من الواضح أن استخدام IF:

if ( !any.HasValue )
  return (any.Value && this.SomeBool) ? true : any;
else 
  return any;

إن وجدت null, ، ثم تريد العودة true أو null, ، حقا؟

لن يعمل مشغل الفحم الخالي من كيفية تنظيم المنطق لطريقتك. من المؤكد أنك يمكن أن تجبرها هناك ، لكنها ستبدو قبيحة وتخلط بين من يقرأها.

لقد وجدت الكود الأصلي يصعب قراءته وفهمه ، لذا فقد أعيد إعادة تمهيده وإزالته من المشغل الثلاثي للكشف عن النوايا.

bool? any = this.ViewState["any"] as bool?;

if (any == null)
    return null;

return any.Value && this.SomeBool;

الفحم الفارغ هو مجرد اختصار لطيف ويجب استخدامه بحكمة

Person contact = Mother ?? Father ?? FirstSibling;

هو أكثر نية للكشف ، وأسهل لقراءة + صيانة من:

Person contact = Mother;
if (contact == null)
    contact = Father;
if (contact == null)
    contact = FirstSibling;

الشيء هو ، أنت لا تريد حقا استخدام ؟؟ المشغل أو العامل. من المفترض أن تجعل من السهل تجنب الفهود ، فأنت تريد بالفعل الاحتفاظ بالخلفيات.

هذا له السلوك الذي تصفه:

return (any ?? false) && this.SomeBool

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