لماذا String من نوع Reference

السلام عليكم ورحمة الله وبركاتة

هل المتغير String نوعه Reference في جميع اللغات ام فقط في منصة الدوت نت

ولماذا صار Reference هل هي غلطه

وهل هو عبارة عن مصفوفة من char

وشكرا جزيلآ لكم

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

عبد الرحمن أحمد أضف ردا

الإجابة في نص الموضوع

هي مرجعية لأنها مصفوفة بايتات تمثل قيمة (char) والمصفوفة يشار إليها بعنوان أول خانة فإن لم يكن هناك أي رمز يعني أنه لا توجد خانات وبالتالي فالمصفوفة صفرية ولا داعي لحفظ المرجع فيكون null

بخلاف الأنواع ذات القيمة والتي في أية حال لها قيمة حتى لو كان صفر فهي قيمة وليست null

اسف لم افهمك

هل تقصد ان هذا الكود لن يتم حفظه في الذاكرة Dim str As String

-

هي مرجعية لأنها مصفوفة بايتات تمثل قيمة (char)

اتمنى منك التوضيح أكثر

نعم طالما أنه لا يحوي قيمة فلا يتم حفظه في الذاكرة لكن في حال حوى قيمة يتم معاملته معاملة المتحول ذو القيمة

عادة النوع string يعتبر حالة خاصة من الأنواع المرجعية

حيث هو النوع الوحيد الذي يسمح أن يسند إلى ثابت const رغم أنه صنف مرجعي بخلاف الأصناف الأخرى

صحيح أنه مصفوفة رموز لكنه بمجموعها يعامل كما لو كانت قيمة ثابتة مثلها مثل قيم الأنواع ذات القيمة

وحسب ما أعلم أن المترجم يقوم بحفظ كل السلاسل المعرفة مسبقاً في أماكن ثابتة بحيث يتم الرجوع إليها في حال تشابه المتغيرات

فمثلا لو عندك نص اسمه "ABCD" وقمت بإنشاء متغيرين من النوع سترينغ ووضعت فيهم نفس القيمة السابقة فإنه لا يخزنها مرتين

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

الفكرة كلها في تقليل استهلاك الموارد وتحسين الاداء عند التعامل مع النصوص.

AhmedXALI أضف ردا

فمثلا لو عندك نص اسمه "ABCD" وقمت بإنشاء متغيرين من النوع سترينغ ووضعت فيهم نفس القيمة السابقة فإنه لا يخزنها مرتين

اذا كان قصدك هكذا

Dim n1 as string = "Ahmed"

Dim n2 as string = "Ahmed"

اعتقد انه لن تأشر لنفس القيمة في manged heap هل هذا صحيح؟ عكس هذا

Dim n1 as string = "Ahmed"

Dim n2 as string = n1


هل تحويل القيم الى نصوص ToString تقوم بتخزينها بالذاكرة؟

-

بما ان المتغير النصي بدون قيمة لن يتم حفظه في الذاكرة فكيف هذا الكود يعمل

Dim b As String

    '
    'Some Code's
    '
    b = "ahmed"

عندما يمر عليه المترجم هل سيتم تعريفه في الذاكرة ام فقط سيخزن اسم المتغير المرجعي في stack

-

اسف فانا شخص معقد والانجليزية ضعيفه

ما يجري في manged heap يحتاج مراجعة لمعرفة الأمر بدقة

بالنسبة لل ToString هو وظيفة تعيد قيمة والقيمة تستقر في المتغير الذي تضعه فيه أو أنها تزيل كل شيء فور الخروج من النطاق scope أو مع أول عملية تنظيف للذاكرة .

عندما يمر عليه المترجم هل سيتم تعريفه في الذاكرة ام فقط سيخزن اسم المتغير المرجعي في stack

بصراحة لم أهتم لهذا الأمر كثيرا لأنه لم أصل لبناء تطبيق يتطلب هذا المستوى من التعمق

فإدارة العملية من قبل الدوت نت تكفي لمعظم التطبيقات غير الكبيرة.

شكرا بارك الله فيك

انا اهتم بالتفاصيل كثيرآ

ليست غلطة، الـ string مرجعية لأنها قد تكون كبيرة للغاية بالنسبة للـ stack، نعم في الذاكرة هي عبارة عن مصفوفة بايتات ككل شئ آخر.

في StringBuilder داخليا القيمة تخزن في مصفوفة char و هو أفضل لأن الـ string التقليدية غير قابلة للتغيير immutable أي كل مرة

تعدل عليها في الحقيقة أنت تنشئ string جديدة تماما في الـ heap.

لم افهم كيف ممكن تكون كبيرة بالنسبة للـ Stack

اتمنى ان تشرح لي ايضا كيف يكون شكل القيم في الذاكرة لم افهمها "نعم في الذاكرة هي عبارة عن مصفوفة بايتات ككل شئ آخر."

وشكرا جزيلآ لك

إفتراضيا في الدوت نت الـ stack حجمه 1mb يمكن أن تعدله في برنامج بتغيير الـ PE Header و يمكن أن تغيره فيـ Thread

بتمرير الحجم في المشيّد (constuctor) الخاص بها. لكن 1mb كافية و لا يجدر بك تغييرها إلا في حال أنك تعرف بالضبط ما تفعل.

الـ string يمكن أن تكون أكثر بكثير من 1mb و لهذا مكانها المناسب ليس على الـ stack.

و هذا كيف تبدو القيم في الذاكرة نظريا:

شكرآ جزيلآ لك الله يوفقك

هل هذا الكود

  Dim SString(100) As Char
    SString = "Ahmed".ToCharArray

سيخزن في Stack

الموشرات ذات علاقة كبيرة بالمصفوفات لكن هي تختلف عنها كثرا

يعود الامر الى كيفية استخدام كل منهما

النص الذي تدخله قد يكون اطول من توقع نهاية المصفوفة ..

باعتقادي ان النص م}شر يحسب طوله ثم يحول لمصفوفة من طوله

فقد يكون النوعين .... في مرحلة الادخال مؤشر وفي ما يليها مصفوفة

شكرا وبارك الله فيك