سؤال

إذا أنا بناء سلسلة باستخدام بـ stringbuilder الكائن في الأسلوب ، هل يعقل أن:

عودة بـ stringbuilder كائن ، والسماح رمز الدعوة دعوة ToString()?

return sb;

أو عودة السلسلة عن طريق الاتصال ToString() نفسي.

return sb.ToString();

أعتقد أنه فرقا إذا نحن نعود صغيرة أو كبيرة السلاسل.ما يمكن أن يكون مناسبا في كل حالة ؟ شكرا مقدما.

تحرير:أنا لا أخطط آخر تعديل السلسلة في كود الاتصال ، ولكن نقطة جيدة كولن بورنيت.

أساسا هو أكثر كفاءة للعودة بـ stringbuilder كائن أو السلسلة ؟ سيكون إشارة إلى سلسلة الحصول على عاد ، أو نسخة ؟

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

المحلول

عودة بـ stringbuilder إذا كنت تريد الذهاب إلى تعديل السلسلة ، وإلا عودة السلسلة.هذا هو API السؤال.

وفيما يتعلق بالكفاءة.لأن هذا هو غامض/سؤال عام دون أي تفاصيل ثم أعتقد قابلة للتغيير مقابلغير قابل للتغيير هو أكثر أهمية من الأداء.إن التغير هو API مسألة السماح API العودة للتعديل الكائنات.طول السلسلة لا علاقة له هذا.

وقال أن.إذا نظرتم بـ stringbuilder.ToString مع عاكس:

public override string ToString()
{
    string stringValue = this.m_StringValue;
    if (this.m_currentThread != Thread.InternalGetCurrentThread())
    {
        return string.InternalCopy(stringValue);
    }
    if ((2 * stringValue.Length) < stringValue.ArrayLength)
    {
        return string.InternalCopy(stringValue);
    }
    stringValue.ClearPostNullChar();
    this.m_currentThread = IntPtr.Zero;
    return stringValue;
}

يمكنك أن ترى أنه قد جعل نسخة ولكن إذا كنت تعديله مع بـ stringbuilder ثم أنها سوف تجعل نسخة ثم (وهذا هو ما استطيع ان اقول وجهة m_currentThread لأن إلحاق يتحقق هذا وسوف نسخ إذا كان التطابق الترابط الحالي).

أعتقد أن الغاية من هذا هو أنه إذا كنت لا تعديل بـ stringbuilder ثم لا نسخ السلسلة و هو غير ذي صلة إلى الكفاءة (إلا إذا كنت ضرب 2 إذا).

التحديث

النظام.السلسلة هي فئة مما يعني أنه هو المرجعية نوع (بدلا من القيمة نوع) حتى "سلسلة فو;" هو في الأساس مؤشر.(عند تمرير سلسلة إلى أسلوب يمر المؤشر ، وليس نسخة.) النظام.سلسلة قابلة للتغيير داخل mscorlib ولكن ثابتة خارج من ذلك وهو كيف بـ stringbuilder يمكن التلاعب سلسلة.

لذلك عندما ToString() ويسمى ذلك يعود الداخلية الكائن سلسلة بالإشارة.عند هذه النقطة لا يمكن تعديله لأن التعليمات البرمجية الخاصة بك ليست في mscorlib.من خلال وضع m_currentThread الميدانية إلى الصفر ثم أي مزيد من العمليات بـ stringbuilder سوف يؤدي إلى نسخ كائن string بحيث يمكن تعديلها و لا تعديل كائن string عاد في ToString().النظر في هذا:

StringBuilder sb = new StringBuilder();
sb.Append("Hello ");

string foo = sb.ToString();

sb.Append("World");

string bar = sb.ToString();

إذا بـ stringbuilder لم يجعل نسخة ثم في نهاية فو سيكون "مرحبا العالم" لأن بـ stringbuilder تعديله.ولكن نظرا لأنه لم تجعل نسخة ثم فو لا يزال مجرد "مرحبا" و شريط "مرحبا العالم".

هل هذا توضيح كامل عودة/مرجع الشيء ؟

نصائح أخرى

وأنا لا أعتقد يجب أن يكون أداء عاملا في هذه المسألة. وفي كلتا الحالتين ما يجري للاتصال sb.ToString () حتى ذهابك إلى اتخاذ ضرب في مكان ما.

والسؤال الأهم هو ما هو القصد من الأسلوب والغرض. إذا كان هذا الأسلوب هو جزء من البناء قد تعيد بناء السلسلة. وإلا سوف أعود سلسلة.

وإذا كان هذا هو جزء من API العام أود أن تميل إلى إرجاع سلسلة بدلا من البناء.

وأود أن أقول طريقة يجب أن تعود sb.ToString (). إذا كان المنطق المحيطة إنشاء كائن ل StringBuilder () يجب أن تتغير في المستقبل فمن المنطقي بالنسبة لي أن تغيير في الأسلوب وليس في كل سيناريو الذي يستدعي الأسلوب ثم يمضي إلى القيام بشيء آخر

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

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

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

وسوف أعود لstring في جميع الحالات تقريبا، وخاصة إذا كان الأسلوب هو جزء من API العام.

وسوف يكون استثناء إذا الأسلوب الخاص بك هو مجرد جزء من عملية أكبر، خاصة "باني" ورمز الدعوة سوف تفعل المزيد من التلاعب. في هذه الحالة ثم كنت ربما التفكير في العودة إلى StringBuilder.

ومنذ بك لن تعديله بعد الآن

return sb.ToString();

وينبغي أن تكون أكثر كفاءة

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

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

وعند التفكير فيه في الوقت الحالي، فإن الجواب هو أكثر وضوحا. مسألة الطلب الذي ينبغي أن تعاد إجابات حقا على هذا السؤال. يجب أن يكون الهدف عودة سلسلة. والسبب هو أنه إذا كنت تسأل هذا السؤال: "هل هناك سبب للعودة الكائن ب StringBuilder عندما سلسلة ستفعل؟" ثم الجواب هو لا. إذا كان هناك سبب، ثم تعود سلسلة سيكون غير وارد، لأن هناك حاجة إلى أساليب وخصائص ل StringBuilder.

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

وهناك اعتبارات أكثر تقنية أخرى، ولكن أن يكون على أعلى مستوى القلق.

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

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