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

هل String Is Value Type Or Reference Type

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

السلام عليكم

كنت بسأل سؤال عن الــ String

هل هو Value type

ولا

reference type

وازاي اثبت ذلك

؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#2

ضع هذا الكود في Form Load Event مثلا وستعرف الاجابه :)

  1. Dim str As String = "aax"
  2. str.Replace("x", "b")
  3. MsgBox(str)
  4.  

#3

وهذا مثال اذا تبي تفحص المتغير اللي تبيه

 Dim str As String = "vb.net"

		If IsReference(str) Then
			MsgBox(Boolean.TrueString)
		Else
			MsgBox(Boolean.FalseString)

		End If
#4

مشكور إخواني على المساعدة بس تعالوا كدة نشرح الموضوع واحدة واحدة

دلوقتي المفروض ان الريفرانس تايب ده لو ساوينا اتنين متغيرين من الريفرانس تايب يبقى بيشاورا على نفس المكان

يعني دلوقتي في متغير اسمه Str1

فاول لما اضع له قيمة سوف يعمل مكان في الذاكرة ويضع فيها القيمة دي

وليكن هانضع كلمة محمد

ولو عرفنا متغير تاني اسمه Str2

سوف لم يكون له مكان طبعا غير لما اضع له قيمة او اساويه بمتغير تاني,

روحنا قولنا للــ Str2 = Str1

على طول البوينتر بتاع الــ Str2 هايشاور على المكان اللي الــ Str1 بيشاور عليه صح ؟؟

ولو عرضنا قيمة الــ Str2 سوف يعرض كلمة محمد

ولو عرضنا قيمة الStr1 هايعرض محمد

لأنهم بشاوروا على نفس المكان اللي مكتوب فيه محمد

دلوقتي بقى لو غييرنا قيمة الــ Str2

ووضعنا فيه كلمة "علي"

معنى كدة انه شال كلمة محمد اللى في المكان المشار إله ووضع كلمة "علي" لغاية كدة كويس

دلوقتي احنا اتفقنا ان الإتنين دلوقتي بشاورو على مكان واحد

معنى كدة لو ندهنا على Str1 سوف يعرض كملة "علي"

ولكن اذا عرضناه بالفعل سوف يعرض كلمة "محمد"

وهذا هو اللي عاوز افهمه

والكود التالي بيوضح الكلام اللي بقوله

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim Str1 As String
		Dim Str2 As String

		Str1 = "Mohamed"
		Str2 = Str1

		Label5.Text = Str1
		Label6.Text = Str2


		Str2 = "Ali"


		Label7.Text = Str1
		Label8.Text = Str2

	End Sub

Ref.rar

تم تعديل هذه المشاركة بواسطة MohamedAliSalim في 12 يوليو 2008 في 11:11

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#5

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

  1. Str2 = "Ali"
  2.  

ناتج تنفيذ هذا السطر ليس تغيير ما هو موجود بالـ Heap وانما يتم انشاء String Instance جديد ويتم اعطاء المتغير Str2 العنوان الجديد لهذا الـ Instance (وبسبب ذلك فأنت متشكك بأمر الـ String وكيف هو Reference Type) وتظهر القيمة الجديده للمتغير Str2 وكدليل على ذلك نفذ الكود التالي:

  1. Dim x, y As String
  2. x = "a"
  3. y = x
  4. x = "b"
  5. MsgBox(y)
  6.  

وستستنتج أنه كل متغير مستقل بذاته.

وصلت ولا؟ :)

تم تعديل هذه المشاركة بواسطة hazzoom في 12 يوليو 2008 في 13:21

#6

تمام كدة

يعني كل متغير مستقل بذاته في النهاية

امال ايه لازمة ان نقول عليه انه ريفرانس مع انه في الأخر زيه زي الValue type

وهو بالفعل ريفرانس طب نستفاد منه ازاي وهو بيعمل زي الValue type

معلش على الأسئلة بس محتاج إقناع مش اكتر

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#7

هو بالفعل Reference Type ولكن عندما تقوم بعمل Assigning New Value كما قلت يتم انشاء Instance جديد ثم يتم حذف الـ Adress القديم ثم يحمل المتغير Address القيمة الجديده الموجوده في الـ Heap ولكن الـ Address الجديد في الـ Stack أيضا كأي Reference Type.

ما يسبب اللبث هو انشاء Instance جديد هي التي أعطت الايحاء بأن الـ String له Value Type behavior, وهذه العمليه يقوم بها الـ CLR لأن الـ Heap هو CLR Managed.

تمام كده ولا؟ :)

#8

تمام ياباشا

:clapping:

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

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