سؤال

هل تعمل ثبات السلسلة عن طريق العبارة أم عن طريق السلاسل الموجودة في العبارة؟

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

string s = "hello ";
s += "world!";

ستبقى كلمة "hello" في الكومة حتى يتم تجميع البيانات المهملة؛و S يشير الآن "Hello World!" على كومة.ومع ذلك، كم عدد السلاسل التي يخصصها السطر التالي على الكومة...1 أو 2؟وأيضاً هل هناك أداة/طريقة للتحقق من النتائج؟

string s = "goodbye " + "cruel world!";
هل كانت مفيدة؟

المحلول

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

إعادة اختبار النتائج...ربما تكون أسهل طريقة (في هذه الحالة) هي النظر في العاكس:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

كما ترون (ldstr)، لقد قام المترجم بهذا من أجلك بالفعل.

نصائح أخرى

السلاسل الحرفية هي المعتقل هذا يعني ذاك "hello " يفعل لا توجد على الكومة ولكن في مقطع البيانات [انظر التعليق] من البرنامج (وبالتالي فهو غير مؤهل لجمع البيانات المهملة)، وينطبق الشيء نفسه على "world", ، أما بالنسبة لل "hello world" والتي قد يتم تدريبها أيضًا، إذا كان المترجم ذكيًا بدرجة كافية.

"goodbye cruel world" سوف يتم تدريبه نظرًا لأن التسلسل الحرفي للسلسلة هو شيء يعالجه المترجم.


يحرر: لست متأكدًا من بيان شريحة البيانات، يرجى الاطلاع هذا السؤال للمزيد من المعلومات.

والواقع، وربما 3. سلسلة CONST ل "وداعا"، سلسلة CONST ل "العالم القاسي"، ثم سلسلة جديدة للنتيجة.

ويمكنك معرفة على وجه اليقين من خلال النظر في الشفرة التي تم إنشاؤها. ان ذلك يعتمد على المترجم، (و، في الواقع، على اللغة، وهذه ليست واضحة) ولكن يمكنك أن تقرأ إخراج ز ++ باستخدام العلامة -A (على ما أظن، راجع صفحة رجل) للحصول على رمز وسيطة .

ولا تثق ما "يعرف" حول سلاسل. قد تبدو من خلال شفرة المصدر لتنفيذ سلسلة. على سبيل المثال المثال الخاص بك:

string s = "goodbye " + "cruel world!";

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

ولكن في الوقت الراهن، بقدر ما أعرف، وذلك باستخدام هذا:

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

لإنشاء سلسلة 1000 الفضاء لا يزال يميل إلى أن يكون غير فعال للغاية

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

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

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

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

إذا انها ليست فقط في خط واحد، وسلسلة من سلسلتين قد يتحقق من خلال جعل السلسلة الأولى في StringBuffer، القيام سلسلة، وإعادة سلسلة النتيجة.

وإنشاء StringBuffer نفسك قد تبدو مبالغة، ولكن هذا ما سيحدث على أي حال .-

وبكل الوسائل لا أمثل قبل الأوان، ولكن لا نستبعد مدى الضرر concatonations سلسلة performant لليمكن أن يكون. انها ليست إنشاء كائن، ولكن العمل GC أنه يسبب.

وهناك مختبر في (التصعيد المهندس ASP.NET) بلوق تيس Ferrnandez في التي تظهر من ل (متطرفة نوعا ما، منح) مثال <لأ href = "http://blogs.msdn.com/tess/archive/2008/02/27/net-debugging-demos-lab-4-high-cpu-hang-review .aspx اتصال "يختلط =" نوفولو noreferrer "> كيف سلسلة concatonation يمكن أن يحقق الخادم على ركبتيها .

وإذا كان المترجم هو "ذكية"، وسوف يكون فقط سلسلة واحدة مع "وداعا العالم القاسي!"

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