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

الفرق بين ByRef و ByVal

مغلق
بدأه Ayoub JAMAL EL IDRISSI في 12 يوليو 2005 · 14 رد · 8,476 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

عندما نقوم بانشاء Function جديدة و نعطيها Parametrs جديدة دون تحديد هل هذه البرامترز ستمرر ByVal او ByRef يقوم الفيجوال بيسك تلقائيا بجعلها ByVal ...

اذا ما هي حقيقة الفرق بين ByVal و ByRef ؟ قد يقول البعض هذا لا يهمنا اذا أني لم أواجه أية مشكلة باستعمال ByVal ... لكن هل فعلا ByVal صالحة في جميع الحالات ؟ لو كانت كذلك فلما اصلا وجود ByRef ؟؟

للاجابة على هذه التساؤلات سنقوم أولا بتعريف كل من ByVal ثم ByRef ثم عمل مثال بسيط لنبين الفرق بينهما تطبيقيا

ByVal : بواسطة هذه ال KeyWord التي تأتي قبل البرامتر في Function معينة :

Public Function Add(ByVal Number1 As Integer,ByVal Number2 As Integer) As Integer

نقوم فقط بتمرير نسخة من المتغيرين Number1 و Number2 أعني بنسخة أن المتغيرين الأساسين الممررين الى ال Funcion Add لن يحدث اي تغيير في المتغيرين الأصلين حتى لو غيرنا في في قيمتهما داخل ال Function Add ... يبدو أن كلا مي يبدو غامضا للبعض لذلك سنكتب مثال جد بسيط

لنفرض ان الكود أسفله موجود في ال Click Event الخاصة مثلا ببوتن :

Dim X,Y As Integer
X=15 : Y=10
Add(X,Y)

كما تلاحظون أننا مررنا الى الفنكشن Add متغيرين X,Y و بالتالي الفنكشن Add سترجع لنا جمع الرقمين ... قد تقول : أوكي وماذا اذا هذا أمر عادي و ال ByVal هنا لن تشكل لنا اي مشكل .

نعم أنا أتفق معك 100/100 ذلك لأننا لم نغير قيم المتغيرين الذين مررناهما بل فقط استعملنا قيمهما لاستخراج قيمة أخرى ...

لكن ماذا لو كنا نريد أن نغير قيم المتغيرن الذين مررناهما ؟؟ هل ال ByVal ستنفع ؟؟ أكيد لالالالالالالالالالالالالالالالالالالالالالالا

فلنأخذ كمثال فنكشن بسيطة تقوم بتغيير قيمة X و تعطيها ل Y و تأخذ قيمة Y و تعطيها ل X و ليكن اسمها Swap

Public Function Swap(ByRef X As Integer,ByRef Y As Integer)
Dim Tmp As Integer
Tmp=X
X=Y
Y=Tmp
End Function

و سنقوم باستدعاء هذه الدالة هكذا :

Dim X As Integer =10
Dim Y As Integer =20
Msgbox " X Value = " & X & VbCrlf & " Y Value = " & Y

Swap(X,Y)

Msgbox " X Value = " & X & VbCrlf & " Y Value = " & Y

ستجد أن نتيجة ال MsgBox اللي قبل استدعاء الدالة Swap ستكون نتيجته

X Value = 10
Y Value = 20

و هذه طبعا هي القيم التي أعطيناها للمتغيرين

لكن ستكتشف أن نتيجة ال MsgBox اللي بعد استدعاء الدالة ستكون كالتالي

X Value = 20
Y Value = 10

هذا لأننا قمنا بتمرير المتغير الى الفنكشن و جعلناه قابل للتغير من قبل هذه الأخيرة

لكن حاول أن تضع مكان ByRef الكلمة ByVal في الفنكشن Add و ستجد انه لا يحدث اي تغيير لأننا (كما ذكرت سابقا) قمنا فقط بتمرير نسخة من المتغير و بالتالي لن تستطيع تغيير قيمة المتغير الأصلي

على فكرة هذا الفرق موجود حتى في الفيجوال بيسك 6 و المفهوم ذاته موجود في السي ++ و الشارب

أتمنى أن يكون المفهوم قد و صل اليكم

و السلام عليكم

تم تعديل هذه المشاركة بواسطة الغملاسي في 7 يوليو 2006 في 05:47

#2

أولا مشكور على الشرح, و لكنى أعتقد أن الموضوع لن يكون بهذه السهولة و قد يسبب لبسا بالنسبة للشباب الذين يسمعون أول مرة عن هذا الموضوع

عموما مشكور للتطرق لهذا الموضوع

#3

جزاك الله كل خير يا اخي العزيز

#4

مشكور كفيت ووفيت

بكلمتبن byval لا تغير القيمة القديمة والممررة للدالة

والعكس مع الاخرى

الكابـــــــــــwinxp4444ـــــــتـــــــــن

بعض من برامجى

see itdeeb monitor 2005

net monitor 2004

deeb security system

deeb encription system-with speshal algo. make by me

deeb mdb killer

deeb cash pass killer

ديب دلول ▒ deebdalloul

for i= 1 to 10000 deeb x*i programblood.gif

#5

الف الف شكر لك اخي على الشرح الرائع

#6

Thanks alot

3424.gif
#7

جزاك الله

1.GIF
#8

جزاك اله خيرا على الموضوع

جزاك اله خيرا على الموضوع

جزاك اله خيرا على الموضوع

جزاك اله خيرا على الموضوع

#10

يعطيك العافيه اخوي على الشرح وننتظر المزيد

بس حبيت اضيف انو ByRef تمرر المتغير ولكن في الحقيقه انت تقوم بتمرير ال Address Memory

ByVal زي ما قلت اخوي تتم بانشاء نسخه من المتغير ومن ثم تقوم بالتعديل عليه

وبالتالي Ref هي اعطاء المتغير او Object عن طريف ال Address

شكرا

#11

شكراً جزيلاً لك أخي

و إذا رأيت نيوب الليث بارزةً ₪₪₪ فلا تظنن الليث يبتسم

For I = 0 To ArabTeam.Members.Count -1
	If Not(ArabTeam.Members(I).LoveArabTeam) Then
		MessageBox.Show("No Body Likes U")
	Else
		MessageBox.Show("U R Welcome!!!")
	End If
Next
#12

جزاكم الله خيرا

#13

شكرا اخي ايوب لشرح هذا الجانب المهم فكثير يجهلونه

تكملة للموضوع و للتوسع في الموضوع تابعوا هذه المشاركة:

بعض المفاهيم في .NET, تعلم كيف يعمل .NET

اللهم صل و سلم على سيدنا محمد

كاف و نون خلقهم و فنائهم كاف و نون

عالمي شاشة و لغتي صفر و واحد

Just Smile ............You can do it

When you stop learning ... You stop leading

لساني بنطقي صامت عنه عادل............وقلبي بصمتي ضاحك منه هازل

وأتـعـب من نـاداك من لا تـجيبـه............وأغـيظ من عـاداك من لا تـشاكـل

مدونتي الشخصية : Tammam Koujan

آخر مواضيع المدونة :

#14

ليس هذا فقط بل الكثيـــــــــــــــــر ...

منها :

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

فأن ال ByVal تقوم بوضع المتغير وقيمتة داخل القسم Stack من الذاكرة.

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

ميزتها : انها لا تحتاج الى GC فهى تقوم بقتل متغيراتها عندها الخروج من اجراءها أو مداها أو حتى عند قتلها منطقيا

أما تال bYrEF

فهى تقوم بحفظ قيمها فى القسم Managed Heap فى الذاكرة وعند عملية مساوة المتغير بمتغير أخر ستقوم بعمل Pointer مؤشر للقيمة يشاور على المتغير الجديد وليس نسخ القيمة مثل ByVal

تحتاج الى المجموعة GC عند تحرير متغيراتها من الذاكرة ....

والشرح فيها يطول

#15

مالذي يقابلها في السي شارب

هذا الموضوع مغلق.

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