أنجع وسيلة لاختبار نوع الكائن
سؤال
لقد القيم المخزنة في السلاسل DataTable
حيث كل قيمة حقا يمكن أن تمثل int
, double
, أو string
(كانوا جميعا تحويلها إلى سلاسل أثناء عملية الاستيراد من مصدر بيانات خارجي).أحتاج إلى اختبار ومعرفة ما هو نوع كل قيمة حقا.
ما هو أكثر كفاءة تطبيق (أو لا يوجد فرق عملي)?
- في محاولة لتحويل
int
(ثمdouble
).إذا كان التحويل يعمل, عودةtrue
.إذا تم طرح استثناء, عودةfalse
. - التعبيرات العادية مصممة لتتناسب مع نمط من
int
أوdouble
- طريقة أخرى?
المحلول
استخدام مزدوج.TryParse ، فقد مزايا الأداء.
نصائح أخرى
أود أن أقول, لا تقلق كثيرا حول هذه الدقيقة الأداء.هو أفضل بكثير من مجرد الحصول على شيء للعمل ، ومن ثم جعلها واضحة وموجزة وسهلة القراءة ممكن.أسوأ شيء يمكنك القيام به هو التضحية القراءة من أجل مبلغ ضئيل من الأداء.
في النهاية, أفضل طريقة للتعامل مع مشكلات الأداء هو لإنقاذهم عندما يكون لديك البيانات التي تشير إلى وجود الأداء الفعلي المشكلة...وإلا سوف تنفق الكثير من الوقت الدقيقة تحسين و فعلا يسبب ارتفاع تكاليف صيانة في وقت لاحق.
إذا كنت تجد هذا تحليل الوضع حقا عنق الزجاجة في التطبيق الخاص بك, ثم هو الوقت المناسب لمحاولة معرفة ما أسرع طريقة لحل المشكلة.أعتقد جيف (وغيرها الكثير) وقد كتبت عن هذا النوع من الشيء الكثير.
سوف تحصل على نتائج مختلفة عن أساليب مختلفة اعتمادا على ما إذا كنت تقوم بتجميع مع أمثلية على.أساسا لديك عدد قليل من الخيارات:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof( int )
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse( Convert.ToString( o ), out j )
يمكنك بسهولة انشاء وحدة التحكم التطبيق الذي يحاول كل من هذه 10,000 مرات و يعود المدد لكل (اختبار عندما o int و عندما يكون شيئا آخر).
على try-catch
طريقة أسرع إذا كان الكائن عقد int, و حتى الآن أبطأ إذا كان لا (حتى أبطأ من GetType
). int.TryParse
هو سريع جدا إذا كان لديك سلسلة, ولكن إذا كان لديك كائن غير معروف إنه أبطأ.
ومن المثير للاهتمام, مع .Net framework 3.5 الهند تحولت على o is int
تحقق يأخذ نفس الوقت try-catch
عندما o في الواقع هو الباحث. o is int
إلا قليلا أبطأ إذا كان س هو في الواقع شيء آخر.
مزعج التقدم سوف يلقي تحذيرات إذا كنت تفعل شيئا مثل:
if( o is int )
int j = (int) o;
ولكن أعتقد أن هذا الخلل في التقدم - أنه لا يعرف الباحث هو نوع القيمة وتوصي لك استخدام o as int
بدلا من ذلك.
إذا المدخلات الخاصة بك هو دائما سلسلة int.TryParse
هو الأفضل, وإلا is
المشغل هو الأسرع.
كما لديك سلسلة أود أن ننظر في ما إذا كنت بحاجة إلى معرفة أنه int, بدلا من مزدوجة.إذا int.TryParse
حتى ذلك الحين سوف يمر double.TryParse
لذلك يمكن أن نصف عدد الشيكات العودة إما ضعف أو سلسلة الطابق الزوجي عندما تتوقع int.
المشكلة لديك هو أنه قد تكون هناك حالات حيث يمكن أن تكون الإجابة على جميع الأنواع الثلاثة.
3 يمكن الباحث ، عدد مزدوج أو سلسلة!
ذلك يعتمد على ما كنت تحاول القيام به و كم هو مهم أن يتم نوع معين.قد يكون من الأفضل تركها كما هي طالما يمكنك ، أو حتى بعض مع طريقة وضع علامة على كل واحد (إذا كان لديك عنصر تحكم مصدر من سلسلة الأصلي).
كنت شخصيا استخدم الباحث.tryparse ، ثم انقر نقرا مزدوجا.tryparse.الأداء على تلك الأساليب هو سريع جدا.كلاهما عودة منطقية.إذا كان كل تفشل ثم لديك سلسلة ، في كيفية تعريف البيانات الخاصة بك.