سؤال

لقد تم طرح الكثير من الأسئلة بالفعل حول الاختلافات بين String و String Builder ومعظم الناس يقترحون أن Builder String أسرع من السلسلة. أشعر بالفضول لمعرفة ما إذا كان String Builder جيدًا جدًا ، فلماذا هناك سلسلة؟ علاوة على ذلك ، هل يمكن أن يعطيني بعض الجسم مثالًا حيث ستكون السلسلة أكثر فائدة من String Builder؟

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

المحلول

إنها ليست حالة أكثر فائدة ...

أ String هو String - حرف واحد أو أكثر بجوار بعضها البعض. أذا أردت يتغيرون سلسلة في الطريق ، ستخلق ببساطة المزيد من السلاسل لأنها كذلك ثابت.

أ StringBuilder هو فصل يخلق سلاسل. يوفر وسيلة لبناءها دون إنشاء الكثير من الأوتار المتزايدة في الذاكرة. ستكون النتيجة النهائية دائمًا String.

لا تفعل هذا

string s = "my string";
s += " is now a little longer";

أو

s = s + " is now longer again";

من شأنه أن يخلق 5 سلاسل في الذاكرة (في الواقع ، انظر أدناه).

افعل هذا:

StringBuilder sb = new StringBuilder();
sb.Append("my string");
sb.Append(" is now a little longer");
sb.Append(" is now longer again");
string s = sb.ToString();

من شأنه أن يخلق 1 سلسلة في الذاكرة (مرة أخرى ، انظر أدناه).

يمكنك القيام بالأمر:

string s = "It is now " + DateTime.Now + ".";

هذا يخلق فقط 1 سلسلة في الذاكرة.

كملاحظة جانبية ، إنشاء ملف StringBuilder لا تأخذ قدرا معين من الذاكرة على أي حال. كقاعدة تقريبية:

  • استخدم دائمًا StringBuilder إذا كنت تسلسل السلاسل في حلقة.
  • إستخدم StringBuilder إذا كنت تسلسل سلسلة أكثر من 4 مرات.

نصائح أخرى

يتم استخدام StringBuilder ، كما هو مقترح ، يبني السلاسل ، في حين أن السلاسل هي قيم شخصية غير قابلة للتغيير. استخدم السلاسل عندما تريد تمرير بيانات الأحرف ، استخدم StringBuilder عندما تريد معالجة بيانات الأحرف.

يعد StringBuilder خيارًا أفضل عند بناء وتعديل السلاسل من خلال حلقات ثقيلة أو تكرار.

عمليات السلسلة البسيطة مثل بعض التسلسلات أو ببساطة تخزين قيمة السلسلة تناسب كائن سلسلة قياسي أفضل بكثير.

سؤال مماثل؟ سلسلة مقابل StringBuilder

يعد StringBuilder أفضل عندما تحتاج إلى تغيير القيمة. خلاف ذلك ، ليست هناك حاجة لذلك.

إذا كنت بحاجة إلى استخدام نفس قيمة السلسلة في 10 أماكن ، كما هي ، سأستخدم String. إذا كنت بحاجة إلى تغييره 10 مرات ، StringBuilder.

هل يمكنك حقًا استخدام منشئ سلسلة هنا؟

Console.WriteLine("MyString");

يعد StringBuilder رائعًا عندما تحتاج إلى القيام بكميات كبيرة من التسلسل لبناء سلسلة.

جون سكيت لديه aricle رائع على هذا هنا: http://www.yoda.arachsys.com/csharp/stringbuilder.html

تحقق من القسم الذي يبدأ "لذلك يجب أن أستخدم StringBuilder في كل مكان ، أليس كذلك؟"

هو يكتب:

الفرق المهم بين هذا المثال والما السابق هو أنه يمكننا بسهولة تقديم جميع الأوتار التي تحتاج إلى تسلسل معًا في مكالمة واحدة إلى String.Concat. وهذا يعني أنه لا توجد حاجة إلى سلاسل وسيطة. يعد StringBuilder فعالًا في المثال الأول لأنه يعمل كحاوية للنتيجة الوسيطة دون الحاجة إلى نسخ هذه النتيجة في كل مرة - عندما لا تكون هناك نتيجة وسيطة على أي حال ، لا توجد ميزة.


باختصار ، إنها مفاضلة بين متقلب و ثابت

انظر الى هذا:StringBuilder vs String

StringBuilder ليس أسرع من استخدام سلسلة بقدر إنشاء سلسلة.

يمكن أن يكون StringBuilder أسرع عندما تضطر إلى تسلسل عدة سلاسل معًا (مثل في الحلقة). ستدفع عقوبة أداء عندما يتعين عليك تحويل محتويات إنشاء السلسلة إلى سلسلة.

تتمثل إحدى المزايا الحقيقية لـ StringBuilder Over String في أنه يمكنك تمريرها عبر عدة طرق وإلحاق السلاسل على طول الطريق. لا يمكنك فعل ذلك عن طريق تمرير كائن سلسلة. لذلك إذا كان لديك عملية متكررة حيث تقوم ببناء مثل كائن JSON أو شيء من هذا القبيل ، فيمكنك تمرير StringBuilder من خلال وإلحاق القيم.

السلسلة جيدة لأنها غير قابلة للتغيير. وهذا غير قابل للتغيير جيد ، هو شيء تثبت فيه اللغات الوظيفية.

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

ولكن ، في بعض الأحيان تحتاج إلى تحسينات في استخدام السرعة النقي والذاكرة. في هذه الحالة ، يمكنك استخدام StringBuilder.

مثال:

 var a = "This is a string";
 var b = a;
 a += ". And some part is added";   // a now references another string in memory

 var aSB = new StringBuilder("This is a string");
 var bSB = aSB
 aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot

 Console.WriteLine(b);   // ==> This is a string
 Console.WriteLine(bSB); // ==> This is a string. And some part is added

يتم توفير تحليل يمكن استخدامه على: السلاسل المتسلسل بكفاءة.

في الأساس ، (على الرغم من قراءة الرابط للتحليل الكامل) ، استخدم StringBuilder عند التسلسل في حلقة غير تافهة.

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