منشئ السلسلة:كيفية الحصول على السلسلة النهائية؟

StackOverflow https://stackoverflow.com/questions/227743

  •  03-07-2019
  •  | 
  •  

سؤال

أخبرني أحدهم أنه من الأسرع ربط السلاسل باستخدام StringBuilder.لقد قمت بتغيير الكود الخاص بي ولكني لا أرى أي خصائص أو طرق للحصول على سلسلة البناء النهائية.

كيف يمكنني الحصول على السلسلة؟

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

المحلول

ويمكنك استخدام .ToString() للحصول على String من StringBuilder.

نصائح أخرى

عندما تقول "من الأسرع ربط سلسلة مع منشئ سلسلة"، يكون هذا صحيحًا فقط إذا كنت كذلك مرارا وتكرارا (أكرر - مرارا وتكرارا) متسلسل إلى نفس الكائن.

إذا كنت تقوم فقط بتسلسل سلسلتين وتفعل شيئًا ما بالنتيجة على الفور كـ string, ، فلا فائدة من الاستخدام StringBuilder.

لقد عثرت للتو على كتابة جون سكيت اللطيفة حول هذا: http://www.yoda.arachsys.com/csharp/stringbuilder.html

إذا كنت تستخدم StringBuilder, ثم الحصول على النتيجة string, ، إنها مجرد مسألة اتصال ToString() (ليس من المستغرب).

وبمجرد الانتهاء من تجهيز باستخدام ب StringBuilder، استخدم أسلوب ToString للعودة في النتيجة النهائية.

ومن MSDN:

using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

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

وعن كونها أسرع / ذاكرة أفضل:

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

وتنفيذ لسلسلة مؤثرة جدا.

والمسارات وجوه سلسلة "طول" و "المشتركة" (مستقلة عن طول المصفوفة التي تحمل سلسلة)

وهكذا شيء من هذا القبيل

String a = "abc" + "def" + "ghi";

ويمكن تنفيذها (بواسطة المترجم / وقت التشغيل) على النحو التالي:

 - Extend the array holding "abc" by 6 additional spaces.
 - Copy def in right after abc 
 - copy ghi in after def. 
 - give a pointer to the "abc" string to a 
 - leave abc's length at 3, set a's length to 9
 - set the shared flag in both.

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

a = "abc";
a = a + "def";
a += "ghi";

في هذه الحالة، كنت أفضل حالا باستخدام بناء ب StringBuilder.

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

وأضع 3 أيام العبث مع سلاسل، التخزين المؤقت / إعادة استخدام سلسلة بناة واختبار سرعة قبل نظرت إلى شفرة المصدر سلسلة وأحسب أن المترجم كان يقوم به بالفعل أفضل مما كنت ربما يمكن لحالة استخدامي. ثم كان لي أن أشرح كيف لم أكن أعرف حقا ما كنت أفعله، فكرت فقط فعلت ...

وانها ليست أسرع لCONCAT - كما أشار smaclell بها، والمسألة هي سلسلة ثابتة مما اضطر تخصيص إضافي وrecopying البيانات الموجودة

و"أ" + "ب" + "ج" لم أسرع علاقة باني سلسلة، ولكن concats تتكرر مع سلسلة المتوسطة يحصل أسرع وأسرع كما # من CONCAT ليحصل على أكبر مثل:

س = "أ". س + = "ب". س + = "ج". ...

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