مشغل ومشغل Coalescing Null
-
02-10-2019 - |
سؤال
هل من الممكن استخدام المشغل معًا بأي طريقة ??
والمشغل &&
في الحالة التالية:
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