ما هي خصائص أداء الانعكاس "is" في C#؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/57701

  •  09-06-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

إنه هو مبين أن صب "كما" أسرع بكثير من صب البادئة، ولكن ماذا عن انعكاس "هو"؟ما مدى سوء الأمر؟كما يمكنك أن تتخيل، فإن البحث عن "is" على Google ليس فعالاً إلى حد كبير.

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

المحلول

هناك عدد قليل من الخيارات:

  1. ال فريق التمثيل الكلاسيكي: Foo foo = (Foo)bar
  2. ال as عامل الصب: Foo foo = bar as Foo
  3. ال is امتحان: bool is = bar is Foo

  1. ال فريق التمثيل الكلاسيكي يحتاج إلى التحقق مما إذا كان bar يمكن أن يلقي بأمان ل Foo (سريع)، ثم قم بذلك فعليًا (أبطأ)، أو قم بطرح استثناء (بطيء جدًا).
  2. ال as المشغل أو العامل يحتاج إلى التحقق مما إذا كان bar يمكن إلقاؤها، ثم قم بالإلقاء، أو إذا لم يكن من الممكن الإلقاء بأمان، فإنها تعود فقط null.
  3. ال is المشغل أو العامل يتحقق فقط إذا bar يمكن إرسالها إلى Foo وإرجاع a boolean.

ال is الاختبار سريع لأنه يقوم فقط بالجزء الأول من عملية الصب الكاملة.ال as يعد عامل التشغيل أسرع من طاقم الممثلين الكلاسيكي لأنه لا يلقي استثناءً في حالة فشل طاقم الممثلين (مما يجعله مفيدًا للمواقف التي تتوقع فيها بشكل مشروع أن طاقم الممثلين قد يفشل).

إذا كنت بحاجة فقط إلى معرفة ما إذا كان المتغير barهو Foo ثم استخدم is المشغل أو العامل، لكن, ، إذا كنت ستختبر ما إذا bar هو Foo, ، وإذا كان الأمر كذلك، ثم يلقيها, ، فيجب عليك استخدام as المشغل أو العامل.

يحتاج كل فريق عمل بشكل أساسي إلى القيام بما يعادل is قم بالتحقق داخليًا في البداية للتأكد من صلاحية طاقم الممثلين.لذلك إذا قمت بذلك is تحقق متبوعًا بفريق كامل (إما as cast، أو مع مشغل Cast الكلاسيكي) فأنت تقوم بذلك بشكل فعال is تحقق مرتين، وهو ما يمثل عبئًا إضافيًا طفيفًا.

نصائح أخرى

الطريقة التي تعلمتها هي أن هذا:

if (obj is Foo) {
  Foo f = (Foo)obj;
  f.doSomething();
}

أبطأ من هذا:

Foo f = obj as Foo;
if (f != null) {
  f.doSomething();
}

هل هو بطيء بما فيه الكفاية ليهم؟ربما لا، ولكن هذا شيء بسيط يجب الانتباه إليه، ومن الأفضل أن تفعله.

"is" يعادل بشكل أساسي عامل تشغيل IL "isinst" - والذي تصفه هذه المقالة بالسريع.

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

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