سؤال

كنت أستخدم Reflector للنظر في تنفيذ String.Format وكنت دائمًا تحت الانطباع بأن الحمولة الزائدة من String.Format التي استغرقت وسيطات 1 و 2 و 3 تم تحسين الإصدارات من الطريقة التي تأخذ مجموعة كائن. ومع ذلك ، فإن ما وجدته هو أن يقوموا بإنشاء صفيف كائن ، ثم يطلقون على طريقة تأخذ مجموعة كائن.

1 arg

public static string Format(string format, object arg0)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0 });
}

2 args

public static string Format(string format, object arg0, object arg1)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0, arg1 });
}

3 args

public static string Format(string format, object arg0, object arg1, object arg2)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0, arg1, arg2 });
}

صفيف الكائن

public static string Format(string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    return Format(null, format, args);
}

داخليًا ، ينتهي بهم المطاف باستخدام نفس الرمز ، وبالتالي فإن استخدام إصدارات الوسيطة 1 و 2 و 3 ليس أسرع من إصدار صفيف الكائن.

لذلك سؤالي هو - لماذا هي موجودة؟

عند استخدام إصدار صفيف الكائن مع قائمة قيم مفصولة بفاصلة ، يقوم برنامج التحويل البرمجي تلقائيًا بتحويل الوسائط إلى صفيف كائن بسبب الكلمة الرئيسية Params/ParamArray التي تعتبر بشكل أساسي ما تفعله الإصدارات 1 و 2 و 3 ، بحيث تبدو زائدة عن الحاجة. لماذا أضاف مصممو BCL هذه الأحمال الزائدة؟

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

المحلول

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

سبب آخر هو أنه لا تدعم جميع اللغات وظائف variadic (استخدام params في C#). يتيح ذلك لمستخدمي هذه اللغات تجنب إنشاء الصفيف للحالات الأكثر شيوعًا لتنسيق السلسلة. هذا يوفر الكثير من اللغات التي لا تملك بناء جملة بسيط لإنشاء الصفيف والتهيئة.

نصائح أخرى

أنت تنسى الرمز في التطبيق المطلوب لإجراء المكالمة. إنشاء الصفيف وملء الأمر يتطلب الكثير من IL أكثر من مجرد تمرير 3 args.

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