ما هي خصائص أداء الانعكاس "is" في C#؟[ينسخ]
-
09-06-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- C# هو أداء المشغل 8 إجابات
إنه هو مبين أن صب "كما" أسرع بكثير من صب البادئة، ولكن ماذا عن انعكاس "هو"؟ما مدى سوء الأمر؟كما يمكنك أن تتخيل، فإن البحث عن "is" على Google ليس فعالاً إلى حد كبير.
المحلول
هناك عدد قليل من الخيارات:
- ال فريق التمثيل الكلاسيكي:
Foo foo = (Foo)bar
- ال
as
عامل الصب:Foo foo = bar as Foo
- ال
is
امتحان:bool is = bar is Foo
- ال فريق التمثيل الكلاسيكي يحتاج إلى التحقق مما إذا كان
bar
يمكن أن يلقي بأمان لFoo
(سريع)، ثم قم بذلك فعليًا (أبطأ)، أو قم بطرح استثناء (بطيء جدًا). - ال
as
المشغل أو العامل يحتاج إلى التحقق مما إذا كانbar
يمكن إلقاؤها، ثم قم بالإلقاء، أو إذا لم يكن من الممكن الإلقاء بأمان، فإنها تعود فقطnull
. - ال
is
المشغل أو العامل يتحقق فقط إذاbar
يمكن إرسالها إلى Foo وإرجاع aboolean
.
ال 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" - والذي تصفه هذه المقالة بالسريع.
ينبغي أن تكون سريعة بما فيه الكفاية حتى لا يهم.إذا كنت تتحقق من نوع الكائن بما يكفي لإحداث تأثير ملحوظ على الأداء، فأنت بحاجة إلى إعادة التفكير في تصميمك