سؤال

لقد رأيت للتو كان يستخدم في أحد الإجابات الأخيرة:

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

لماذا نحتاج كلمة ضمنية هنا، وماذا يعني ذلك؟

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

المحلول

يعني ضمنية أن التحويل لا يتطلب يلقي في التعليمات البرمجية الخاصة بك.

يمكنك الآن القيام بذلك:

Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}

بدلا من الاضطرار إلى القيام بذلك:

Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}

مثال واحد عن سبب وجود تمييز مفيد هو أنواع رقمية. هناك تحويل ضمني من أنواع "أصغر" لأنواع "أكبر"، على سبيل المثال:

float f = 6.5;
double d = f; // implicit conversion

لكن تحويل أنواع أكبر إلى أنواع أصغر يمكن أن تكون خطيرة، لذلك لا يوجد سوى تحويل صريح، مما أجبر المستخدم على توضيح أنه يعتزم حقا إجراء العملية المعنية:

long l = 20;
// short s = l;
short s = (short)l;  // explicit conversion

نصائح أخرى

يبدو أن إساءة استخدام مشغل ضمني. لا أعرف ما يفعله فئة SavePoint، ولكن تحويله إلى منطقي لا يبدو منطقا. يتيح لك المشغل الضمني التحقق مما إذا كان مرجع نقطة ساحة خالية أم لا ببساطة تقييم المرجع:

if (point) {

بدلا من:

if (point != null) {

إذا تم استخدامه بهذه الطريقة، فإنه يخفي ما يفعله الكود في الواقع، وهذا يتعارض مع كل ما يدور حوله C #.

فقط لإضافة إلى إجابة mquander.

من مواصفات لغة C #0:

إعلان مشغل تحويل يتضمن implicit الكلمة الرئيسية تقدم تحويل ضمني محدد من قبل المستخدم. يمكن أن تحدث التحويلات الضمنية في مجموعة متنوعة من المواقف، بما في ذلك تداعيات عضو الوظائف والتعبيرات المصبوبين والواجبات.

(القسم 10.10.3)

تحويل محول التحويل من نوع إلى آخر. يعني ضمنية أنك لست مضطرا لكتابة إيصال صريح في التعليمات البرمجية لتحويل التحويل، ويتطلب صريحا أن يتم استدعاؤه في التعليمات البرمجية.

يمكنك استخدام مشغل التحويل الضمني عندما تكون متأكدا من أن التحويل لا يفقد أي بيانات. على سبيل المثال، مع انتصار الإكراك (int -> طويل، تعويم -> مزدوج). يتم استخدام مشغلي التحويل الصريح عند فقد بعض الحالة أو لا تريد التحويل البرمجي لتوفير رمز العميل تلقائيا عن طريق إدراج التحويلات في كل مكان.

من شأن التحويل مثل لك حقا أن يثير الخراب لأنه غير قادر على أداء هذا التحويل بالذات.

تحتاج إلى تحديد "ضمني" لأنه أيضا هناك مشغلون واضحون.

هذا يعني أنه يمكن إجراء التحويل بين المنطقي والوان وسيلة ضمنيا، على سبيل المثال = مخفي.

Savepoint s = new Savepoint();
bool b = s;

يمكن إجراء تحويل صريح، على سبيل المثال، واضح، بهذه الطريقة:

 Savepoint s = new Savepoint();
 bool b = (bool)s;

غالبا ما يستخدم التحويل الضمني عندما لا يكون هناك فقدان بيانات ممكنة، أي Int16 (short) ل Int32 (int). وبعد ولكن إذا كان ذلك ممكنا، فأنت بحاجة إلى "الموافقة" معها باستخدام تحويل صريح.

في حالتك، على سبيل المثال، إذا Savepoint ما هو الا

struct Savepoint
{
  public bool data;
}

يمكنك استخدام التحويل الضمني، لأنه لا يوجد فقدان البيانات ممكنا:

Savepoint s = new Savepoint();
s.data = true;
bool b = s;

وإلا فإنني أوصي بك لتحديد المشغل الصريح!

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