سؤال

أي مما يلي هو أفضل كود في C# ولماذا؟

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

أو

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()

في النهاية هل الأفضل الإلقاء أم التحليل؟

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

المحلول

إذا كان g[0] ["MyUntypedDateField"] هو كائن DateTime حقًا، فإن الإرسال هو الخيار الأفضل.إذا لم يكن DateTime حقًا، فليس لديك خيار سوى استخدام Parse (ستحصل على InvalidCastException إذا حاولت استخدام Cast)

نصائح أخرى

الصب هو فقط اجابة جيدة.

عليك أن تتذكر أن نتائج ToString وParse ليست دقيقة دائمًا - فهناك حالات لا يمكنك فيها القيام برحلة ذهابًا وإيابًا بأمان بين هاتين الوظيفتين.

تقول وثائق ToString أنها تستخدم إعدادات ثقافة مؤشر الترابط الحالية.تقول وثائق Parse، إنها تستخدم أيضًا إعدادات ثقافة سلسلة الرسائل الحالية (حتى الآن جيدة جدًا - إنهم يستخدمون نفس الثقافة)، ولكن هناك ملاحظة صريحة مفادها:

يتأثر التنسيق بخصائص كائن DateTimeFormatInfo الحالي، والذي يتم اشتقاقه بشكل افتراضي من عنصر الخيارات الإقليمية وخيارات اللغة في لوحة التحكم. أحد أسباب إمكانية قيام أسلوب التحليل بطرح FormatException بشكل غير متوقع هو أنه تم تعيين خصائص DateTimeFormatInfo.DateSeparator وDateTimeFormatInfo.TimeSeparator الحالية على نفس القيمة.

لذا، اعتمادًا على إعدادات المستخدمين، يمكن أن يفشل رمز ToString/Parse بشكل غير متوقع...

يشير الكود الخاص بك إلى أن المتغير قد يكون إما تاريخًا أو سلسلة تشبه التاريخ.يمكنك ببساطة إرجاع التواريخ مع طاقم الممثلين، ولكن يجب تحليل السلاسل.التحليل يأتي مع تحذيرين؛

  1. إذا لم تكن متأكدًا من إمكانية تحليل هذه السلسلة، فاستخدم DateTime.TryParse().

  2. قم دائمًا بتضمين إشارة إلى الثقافة التي تريد تحليلها. ToShortDateString() إرجاع مخرجات مختلفة في أماكن مختلفة.من المؤكد أنك سترغب في التحليل باستخدام نفس الثقافة.أقترح أن تتعامل هذه الوظيفة مع كلتا الحالتين؛

    private DateTime ParseDateTime(object data)
    {
        if (data is DateTime)
        {
            // already a date-time.
            return (DateTime)data;
        }
        else if (data is string)
        {
            // it's a local-format string.
            string dateString = (string)data;
            DateTime parseResult;
            if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture,
                                  DateTimeStyles.AssumeLocal, out parseResult))
            {
                return parseResult;
            }
            else
            {
                throw new ArgumentOutOfRangeException("data", 
                                   "could not parse this datetime:" + data);
            }
        }
        else
        {
            // it's neither a DateTime or a string; that's a problem.
            throw new ArgumentOutOfRangeException("data", 
                                  "could not understand data of this type");
        }
    }
    

ثم اتصل هكذا؛

ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();

لاحظ أن البيانات السيئة تؤدي إلى حدوث استثناء، لذا ستحتاج إلى اكتشاف ذلك.

أيضًا؛لا يعمل عامل التشغيل "as" مع نوع البيانات DateTime، حيث يعمل هذا فقط مع أنواع المراجع، وDateTime هو نوع قيمة.

كما @ بريان ر.وأشار بوندي إلى أن ذلك يعتمد على التنفيذ g[0]["MyUntypedDateField"].الممارسة الآمنة هي الاستخدام التاريخ والوقت. حاول التحليل و مثل المشغل أو العامل.

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

ومع ذلك، إذا كان هناك خطر حدوث استثناء عند إجراء عملية الإرسال، فقد ترغب في اتباع المسار الثاني حتى تتمكن من TryParse وتجنب طرح استثناء باهظ الثمن.بخلاف ذلك، اتبع المسار الأكثر كفاءة وقم بالإرسال مرة واحدة فقط (من كائن إلى DateTime) بدلاً من مرتين (من كائن إلى سلسلة إلى DateTime).

هناك مقارنة بين التقنيات المختلفة في http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

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