السلام عليكم
كنت بسأل سؤال عن الــ String
هل هو Value type
ولا
reference type
وازاي اثبت ذلك
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
السلام عليكم
كنت بسأل سؤال عن الــ String
هل هو Value type
ولا
reference type
وازاي اثبت ذلك
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
Mohamed Ali Salim
0.1..0...4....7.....6......2.......7........4.........8
ضع هذا الكود في Form Load Event مثلا وستعرف الاجابه :)
وهذا مثال اذا تبي تفحص المتغير اللي تبيه
Dim str As String = "vb.net" If IsReference(str) Then MsgBox(Boolean.TrueString) Else MsgBox(Boolean.FalseString) End If
مشكور إخواني على المساعدة بس تعالوا كدة نشرح الموضوع واحدة واحدة
دلوقتي المفروض ان الريفرانس تايب ده لو ساوينا اتنين متغيرين من الريفرانس تايب يبقى بيشاورا على نفس المكان
يعني دلوقتي في متغير اسمه 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
تم تعديل هذه المشاركة بواسطة MohamedAliSalim في 12 يوليو 2008 في 11:11
Mohamed Ali Salim
0.1..0...4....7.....6......2.......7........4.........8
كونك غيرت ما يشير اليه المتغير الثاني فليس معناه أنك غير محتوي الذاكره نفسه.. أي أنك عندما قمت بكتابة:
ناتج تنفيذ هذا السطر ليس تغيير ما هو موجود بالـ Heap وانما يتم انشاء String Instance جديد ويتم اعطاء المتغير Str2 العنوان الجديد لهذا الـ Instance (وبسبب ذلك فأنت متشكك بأمر الـ String وكيف هو Reference Type) وتظهر القيمة الجديده للمتغير Str2 وكدليل على ذلك نفذ الكود التالي:
وستستنتج أنه كل متغير مستقل بذاته.
وصلت ولا؟ :)
تم تعديل هذه المشاركة بواسطة hazzoom في 12 يوليو 2008 في 13:21
تمام كدة
يعني كل متغير مستقل بذاته في النهاية
امال ايه لازمة ان نقول عليه انه ريفرانس مع انه في الأخر زيه زي الValue type
وهو بالفعل ريفرانس طب نستفاد منه ازاي وهو بيعمل زي الValue type
معلش على الأسئلة بس محتاج إقناع مش اكتر
Mohamed Ali Salim
0.1..0...4....7.....6......2.......7........4.........8
هو بالفعل Reference Type ولكن عندما تقوم بعمل Assigning New Value كما قلت يتم انشاء Instance جديد ثم يتم حذف الـ Adress القديم ثم يحمل المتغير Address القيمة الجديده الموجوده في الـ Heap ولكن الـ Address الجديد في الـ Stack أيضا كأي Reference Type.
ما يسبب اللبث هو انشاء Instance جديد هي التي أعطت الايحاء بأن الـ String له Value Type behavior, وهذه العمليه يقوم بها الـ CLR لأن الـ Heap هو CLR Managed.
تمام كده ولا؟ :)