سؤال

في أيام البرمجة المبكرة .NET ، استخدمت string.format () فقط للتسلسلات المعقدة

مشكلة مع طلب العميل 234 من التاريخ 2/2/2002 ومعرف الدفع 55543.

لكنني الآن أستخدم String.Format لكل سلسلة متسلقة تقريبًا يجب أن أفعلها ، وأيضًا تلك البسيطة مثل بادئة سلسلة مع شيء ما.

Console.WriteLine(string.Format("\t\t{0}", myString));

هل هناك أي عام محتمل في هذا؟ ربما يجب أن أستخدم العادية + المشغل للقيام بهذه العمليات البسيطة؟

ما رأيك في هذا؟

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

المحلول

للحصول على متسلسلات السلسلة البسيطة استخدم + مقاربة. إنه أكثر وضوحًا للأشياء البسيطة التي لا تتطلب تنسيقًا.

بالنسبة للسلاسل الأكثر تعقيدًا التي لها تنسيق معين وحيث يكون من المفيد الاحتفاظ ببنية السلسلة بأكملها وتوفير عنصر نائب للمدخلات ، استخدم String.Format.

ونعم ، هناك النفقات العامة. String.Format يستخدم StringBuilder أسفل الأغطية. ستكون التسلسلات البسيطة للسلسلة أسرع بكثير في تلك السيناريوهات. يمكن العثور على بعض المعايير ومشاركات المدونة حول هذا الموضوع بسهولة تامة. بالطبع كل هذا يتوقف على استخدامك. إذا كانت مسلبات سلسلة صغيرة تحدث في حلقة ، فعليك الاستخدام المتكرر String.Format من المحتمل أن تكون أكثر وضوحًا من البساطة المباشرة + CONCAT. إذا كنت تبني أ كبير سلسلة في حلقة ثم المثال الكلاسيكي هو التفضيل StringBuilder والأسئلة ذات الصلة على Concat مقابل StringBuilder يمكن العثور عليها على SO.

تعديل: للتوضيح ، هذا يخدم الغرض القليل: String.Format("{0}{1}", a, b) لأنه لا يوجد الكثير من التنسيق. إنه ببساطة a + b. لسوء الحظ ، واجهت مثل هذه الأمثلة في رمز الإنتاج وبمجرد أن أرى String.Format أتوقع أن أرى شيئًا يحتاج إلى تنظيم بطريقة معينة ، وليس مسلسلًا مباشرًا.

Otoh ، فكر في رقم الهاتف هذا: "(" + area + ") " + number + " x" + extension - هناك الكثير مما يحدث وليس من السهل تعديله. في هذه الحالة ، يكون string.format أفضل: String.Format("({0}) {1} x{2}", area, number, extension). لا يزال هذا مثالًا تافدًا لكنك تحصل على الفكرة.

نصائح أخرى

أميل أيضًا إلى استخدام String.Format على معظم العمليات التي تحتاج إلى جمع بين سلاسل/قيم أو أكثر لأنها تنتج القراءة أسهل لقراءة الكود من بدء السلاسل وإيقافها مع +في الوسط.

لتوسيع

string value = string.Format("Hello {0}", user.username);

أكثر قابلية للقراءة وقابلة للتوسيع من

string value = "Hello" + user.username

على سبيل المثال ، إذا كنت ترغب في إضافة تاريخ تسجيل الدخول الأخير كترقية للنظام ، يمكنك ببساطة توسيع الرمز إلى ما يلي

string value = string.Format("Hello {0}, you last logged in {1}", user.username, user.lastLogin);

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

أنا شخصياً أفعل نفس الشيء (طالما أن الوظيفة التي أتصل بها لا تتعامل مع التنسيق بالنسبة لي).


clarrifice

لتسلسل السلسلة العادية مثل "Hello " + "World!"; أود استخدام stringBuilder. يقوم مثالك بتنسيق السلسلة للإخراج عن طريق إعداد علامة تبويب اثنين ... والتي أعتبرها أكثر مثل التنسيق.

هناك فرق بين التنسيق والتسلسل ... كن حذرًا ما تستخدمه.


String.Format() يستخدم stringBuilder داخليًا حتى يكون التسلسل أكثر كفاءة من القيام بتسلسل السلسلة العادية على أي حال.

قد ترغب في تغيير مثالك منذ ذلك الحين Console.WriteLine() يمكن التعامل مع التنسيق نفسه (لا String.Format() ضروري):

Console.WriteLine("\t\t{0}", myString);

قاعدتي هي إذا كان علي استخدام + (التسلسل) أكثر من مرة أقوم بتغييره إلى أ string.Format.

string a = "Something: " + x;   // ok

string b = "Something: " + x + " something else"; // change it to a string.Format
string bB = string.Format("Something: {0} something else", x); // much nicer to read

string c = "Something: " + x + " " + y + " " + z;  // Yuck
string cC = string.Format("Something: {0} {1} {2}", x, y, x);  // Much nicer

لا أعرف عن الأداء ، فمن المحتمل أن يوفر شخص ما هذه البيانات ، لكن شعوري هو أن string.format هو السبيل للذهاب إذا كنت ترغب في وضع سلسلة التنسيق في ملف التكوين الخاص بك (أو حقل قاعدة البيانات أو ملف المورد أو أي شيء آخر) . وبهذه الطريقة ، إذا كنت ترغب في تعديل عدد علامات التبويب ، قم بالتبديل إلى المساحات ، أو إضافة المحددات ، أو أي شيء آخر ، فلن تضطر إلى إعادة الترجمة.

أنا أميل إلى الاستخدام String.Concat بدلاً من String.Format عندما أحتاج فقط إلى بادئة أو لاحقة سلسلة معينة. أنا أفضل الدعوة الصريحة إلى Concatالطريقة ثم لاستخدام + المشغل وإذا كنت تستخدم بالفعل String.Format إنها مجرد مسألة تبديل ضغط مفتاح واحد.

IIRC ، و String.Concat ستكون الطريقة هي نفسها باستخدام المشغل بحيث تكون أسرع أيضًا من String.Format.

أستخدم التنسيق دائمًا تقريبًا ، على الرغم من أنني أستخدم طريقة تمديد بدلاً من طريقة السلسلة الثابتة. أجد أنه من الأسهل فهم ، وأسهل التغيير ، وأسهل بشكل عام. يمكن أن يجعل التوطين أسهل لأنه لا يقدم مشكلات الطلب بالطريقة التي يتم بها التسلسل.

بصراحة ، أيهما يبدو أفضل؟

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top