الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل المتغيرات String من النوع Reference Types ؟

بدأه nmfaraj911 في 7 يوليو 2011 · 11 رد · 706 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أخواني قرأت كثير من المواضيع عن المتغيرات وأنواعها، وهي تنقسم الى قسمين حسب نوع أسنادها :

1 - المتغيرات ذات القيمة Value Type مثل integer , Byte

2- متغيرات مرجعية Reference Types مثل Array ,Class

والسؤال الأن هل المتغيرات String من النوع Reference Types ؟

حسب المواضيع والكتب التي قرأتها تقول ان هذه المتغيرات هي من النوع Reference Types ، ولكن عملية الأسناد تتصرف كأنها Value Type ، نلاحظ المثال التالي :

        Dim strText1 As String = "Good"
        Dim strText2 As String = strText1
        strText1 += " Morning"
        Debug.Print(strText2)

سيتم طباعة الكلمة Good على الرغم من تغيير المتغير الى Good Morning

الوضع يصبح واضحاً في حالة الفئات ، فهل المشكلة في فهمي للموضوع

ارجو سماع رأي الأخوة الأعزاء ودمتم سالمين

تم تعديل هذه المشاركة بواسطة GHOST2010 في 8 يوليو 2011 في 10:27 — السبب: إعادة فتح الموضوع

#2

النوع string هو value type وليس reference type

وبالفعل فى المثال السابق سيتم طباعة الكلمة Good فقط

http://msdn.microsoft.com/en-us/library/hfa3fa08%28v=vs.71%29.aspx

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#3

شكرا أخي GHOST2010 على ردك

كتاب " عبدالله العسيري " بعنوان : برمجة اطار عمل .net باستخدام Visual Basic .net ذكر أكثر من مرة ان المتغيرات string هي من النوع reference type

مثلاً ذكر الكتاب هذه العبارة في أحد صفحاته (وذكرها اكثر من مرة) :

" المتغيرات من النوع String ،المصفوفات Arrays ، والمتغيرات المعرفة من الفئات Classes جميعها متغيرات مرجعية reference type "

ايضاً وجدت بعض المواضيع التي تؤيد هذا الكلام

رابط 1

رابط 2

علماً ان المواضيع السابقة تتكلم عن C# ولكن لا اتوقع ان هناك اختلاف عن VB

#4

الـstring من نوع reference. ولو أننا نتعامل معه على أنه value. مقتبس من موقع MSDN:

اقتباس
Although string is a reference type, the equality operators (== and !=) are defined to compare the values of string objects, not references.

http://msdn.microsoft.com/en-us/library/362314fe.aspx

السبب هو أن الـstring هو سلسلة من قيم char الغير معروفة الطول.

#5

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

اخي النوع string هو نوع مرجعي Reference Type وتخزن قيمته في منطقة في الذاكرة يطلق عليها الـ heap, اما المثال المذكور اعلاه فقد حجز فيه 3 مراجع الاول للمتغير strtext1 والثاني للمتغير strText2 والثالث لعملية اضافة الكلمة Morning للمتغير الاول,طبعا ستقول لماذا؟!! لأن النوع string هو immutable ويعني ان القيمة لا تتغير بعد الاسناد لهذا يفضل اذا كانت عمليت المعلجة للنصوص كثيرة استخدام الفئة StringBuilder

.:: Wish to become better and better ::.

#6

شكرا اخواني System Down و VB Helper على المساعدة

System Down كتب:

الـstring من نوع reference. ولو أننا نتعامل معه على أنه value. مقتبس من موقع MSDN:

http://msdn.microsoft.com/en-us/library/362314fe.aspx

السبب هو أن الـstring هو سلسلة من قيم char الغير معروفة الطول.

يعني النوع String فقد اهم شرط في تعريف Reference Type فلماذا لا يعتبر من النوع الأخر وينتهي الموضوع :wacko: ، ولو افترضنا يا غالي انه كان ثابت الطول(اظن انه لاتوجد هذه المتغيرات في .net) هل سيتصرف بشكل صريح مثل بقية متغيرات Reference Type ؟

VB Helper كتب:

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

اخي النوع string هو نوع مرجعي Reference Type وتخزن قيمته في منطقة في الذاكرة يطلق عليها الـ heap, اما المثال المذكور اعلاه فقد حجز فيه 3 مراجع الاول للمتغير strtext1 والثاني للمتغير strText2 والثالث لعملية اضافة الكلمة Morning للمتغير الاول,طبعا ستقول لماذا؟!! لأن النوع string هو immutable ويعني ان القيمة لا تتغير بعد الاسناد لهذا يفضل اذا كانت عمليت المعلجة للنصوص كثيرة استخدام الفئة StringBuilder

أخي هل ممكن الوصول للمرجع الثالث وقرأة قيمته ؟ وهل توجد روابط تشرح immutable

وأسف جدا على الطلبات الكثيرة لأني في طور التعلم ومتحمس جداً :wacko:

#7

هو لم يفقد خاصية الـreference. ما يحدث في هذا السطر:

strText1 += " Morning"

هو أن الدوت نت سينشئ object جديد من نوع string هو عبارة عن مجموع strText1 و " Morning". وهذا الـobject الجديد يتم إسناده إلى المتغير strText1 أي أن الـobject القديم ما زال موجوداً (وما زال يشير إليه strText2) ولكن strText1 لم يعد يشير إليه. هذا ما نعنيه عندما نقول أن string هو من نوع immutable (غير قابل للتغيير). أي عملية تغيير نقوم بها، هي في الواقع عملية إنشاء string جديد من الصفر. لهذا عملية إضافة الـstring لبعضها البعض هي عملية مكلفة جداً، ويفضل استخدام StringBuilder عندما تحتاج إلى تجميع النصوص.

ما قصدته عندما قلت أن الـstring يعامل بطريقة شبيهة بالـvalue هو في عملية المساواة. حيث نستخدم = بدلاً من is.

#8

بدأت الأن تتضح بعض الأمور :wink:

لكن غريب هذه الحساسية الزائدة لـ String في .net

وكيف أثرت العبارة "الـstring هو سلسلة من قيم char الغير معروفة الطول." على هذه الطريقة الخاصة في التعامل مع String

لاحظ المثال التالي :

Private Sub AddMorning(ByRef Word As String)
	Word += " Morning"
End Sub

Dim strText1 As String
strText1 = "Good"
AddMorning(strText1)
Debug.Print(strText1)

عملية أستدعاء الأجراء وتمرير المتغير بالمرحع يكافئ عملية الأسناد هذه

Word=strText1

الأجراء يقوم يتغيير المؤشر Word ويتغير بدوره الموشر strText1 دون انشاء مؤشر ثالث مخفي على عكس الحالة السابقة في بداية الموضوع !!!!!! يعني التصرف المتوقع جدا في هذه الحالة

#9

تنبه أنك استخدمت ByRef عندما عرفت Word. أي أن الذي يتم تمريره إلى داخل الدالة AddMorning ليس قيمة المتغير بل المؤشر الذي يحتويه هذا المتغير (نفس مفهوم الـpointer في ++C). لذا فإنك حين تغير قيمة Word ما نقوم به فعلاً هو إنشاء string جديد ثم وضع المؤشر الذي يشير إليه داخل Word.

اقتباس
وكيف أثرت العبارة "الـstring هو سلسلة من قيم char الغير معروفة الطول." على هذه الطريقة الخاصة في التعامل مع String

قيم الـvalue عادةً توضع في الـstack (أقول عادةً لأن الموضوع أعقد قليلاً من هذا) وليس في الـheap. الـstack حجمه صغير لذا هو مناسب للقيم المحددة الطول. الـint مهما كبر حجمه لن يزيد عن 32 bit. أما الـstring فهو مفتوح الحجم.

1
#10

شكرا أخي System Down

استفدت كثيرا منك ومن ألأخوة الذين ردو على الموضوع وأنتظر منك المشاركة في المواضيع والاستفسارات القادمة بمشيئة الرحمن

ودمتم سالمين

#11

فى الرابط الذى قمت بوضعه تم تصنيف النوع String على أنه Value Type

اقتباس
The following table lists some of the value types the .NET Framework supplies, briefly describes each type, and indicates the corresponding type in Visual Basic, C#, and the Managed Extensions for C++. The table also includes entries for the Object and String classes, for which many languages have corresponding keywords.

والسبب كما وضح الإخوة الأفاضل وكما هو مذكور أيضا فى الرابط فى وصف النوع String

اقتباس
An immutable, fixed-length string of Unicode characters.

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#12
GHOST2010 كتب:

فى الرابط الذى قمت بوضعه تم تصنيف النوع String على أنه Value Type

والسبب كما وضح الإخوة الأفاضل وكما هو مذكور أيضا فى الرابط فى وصف النوع String

قد تكون تلك الصفحة الوحيدة في MSDN التي تصف string بأنه value type (لا أعرف لماذا). ولكن من نفس الصفحة لو تتبعت الرابط الذي يؤدي إلى تعريف string ستجد أنه لا يرث من System.ValueType كالبقية.

مواضيع مشابهة