عامل ضمني ثابت
-
28-09-2019 - |
سؤال
لقد وجدت مؤخرًا هذا الرمز:
public static implicit operator XElement(XmlBase xmlBase)
{
return xmlBase.Xml;
}
ماذا فعلت static implicit operator
يعني؟
المحلول
هذا ال مشغل التحويل. هذا يعني أنه يمكنك كتابة هذا الرمز:
XmlBase myBase = new XmlBase();
XElement myElement = myBase;
ولن يشكو المترجم! في وقت التشغيل ، سيتم تنفيذ مشغل التحويل - تمرير myBase
في الحجة ، وإعادة صالحة XElement
كنتيجة.
إنها طريقة لك كمطور لإخبار المترجم:
"على الرغم من أن هذين يشبهان نوعين غير مرتبطين تمامًا ، إلا أن هناك بالفعل طريقة للتحويل من أحدهما إلى الآخر ؛ فقط اسمحوا لي أن أتعامل مع المنطق لكيفية القيام بذلك."
نصائح أخرى
مثل هذا المشغل الضمني يعني أنه يمكنك التحويل XmlBase
إلى XElement
بشكل ضمني.
XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
إنه عامل تحويل ضمني (على عكس عامل صريح ، يتطلب (type)
بناء جملة التحويل)
استخدام آخر مثير للاهتمام هو (أي الوحدة التي فعلت للتحقق مما إذا كان كائن (وبالتالي مثيل من monobehavior) فارغ):
public static implicit operator bool (CustomClass c)
{
if (c == null) return false;
else return true;
}
بهذه الطريقة يمكنك أن تفعل شيئًا كهذا:
void Method ()
{
CustomClass c1 = null;
CustomClass c2 = new CustomClass ();
bool b1 = c1; // is false
bool b2 = c2; // is true
if (!c1 && c2)
{
// Do stuff
}
}
من الواضح أن الاستخدام الأكثر شهرة قد يستخدمه لتحويل أحد فصولك إلى فصول أخرى. لكن استخدامها مع الأنواع الأساسية يستحق النظر أيضًا ... وأرى أنه نادراً ما يتم ذكره.