السلام عليكم
ممكن شرح طريقة عمل الـ by val و by ref
ماهي وظيفتهاا .. و الفائده منها في ايش من البرامج ؟
و مالمقصوود بإن يأتي قبــل by val كلـمة optional ؟؟
اتمنى يكون الشرح مبسط لإنني مبتدئه ....... :)
شكرا و يعطيكم العافيه ~ :happy:
السلام عليكم
ممكن شرح طريقة عمل الـ by val و by ref
ماهي وظيفتهاا .. و الفائده منها في ايش من البرامج ؟
و مالمقصوود بإن يأتي قبــل by val كلـمة optional ؟؟
اتمنى يكون الشرح مبسط لإنني مبتدئه ....... :)
شكرا و يعطيكم العافيه ~ :happy:
اتمنى سرعة الرد منكم ........ :happy:
عليكم السلام
بسيطة اختي :happy:
تتعلق بتمرير المقترحات(قيم وكائنات) إلى داخل الدوال (الروتينات)
by val
هي لتمرير نسخة من القيمة بحيث أن عملية الدالة(الروتين) على هذه النسخة لا تؤثر على المتغير الحقيقي المُمرر(الداخل) على هذه الدالة(الروتين) وإنما نسخة منه فقط
وهي تعني By Value (التمرير بواسطة القيمة)
by ref
هي عكس الخاصية الأولى بالضبط وهي تمرير مرجع للمتغير الحقيقي وتؤثر في قيمته الحقيقة خارج تلك الدالة(الروتين)
وهي تعني By Reference (التمرير بواسطة مرجع)
Optional by val
هو إذا أردنا إنشاء مقترحات للروتين ذات قيم استهلالية معينة بحيث إذا تجاهلناها عند الإستدعاء لا تؤثر بالخطأ في عمل الروتين بل ستتعامل مع تلك القيم الإستهلالية
في الرابط تجدين نقاشات حول الموضوع مع الأمثلة
تابعي المشاركات فضلاً من الرابط السابق...
آسفة مو بالعادة اكتب روابط خارجية ولكن لست متخصصة في هذه اللغة وليست لدي أمثلة وانتي مستعجلة شوي :happy:
وإن كانت هذه مفاهيم برمجية عامة
موفقة يارب
[وسط]
♥ Countess ♥

♥
[/وسط]
سأحاول أن أوضح لك الأمر بمثال كالتالي
ملحوظة هامة الكود أدناه يحتاج الفيجوال استوديو 2008 علي الأقل والسبب في ذلك هو أنني استخدمت الكلاس HashSet وهو موجود فقط في الدوت نت 3.5 فيما فوق
لنفرض أننا لدينا String Array تم تعريفها كالتالي ولسوف تلاحظي فهي تحتوي علي أرقام فقط
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}الأن نحن نريد أن نحصل علي أعلي قيمة وأقل قيمة للأرقام الموجودة داخل هذه Array
غالبا هنا ما نقوم بكتابة دالتين للحصول علي اقل قيمة و أعلي قيمة وهاتان الدالتان سيكون الكود الخاص بهما كالأتي
Private Function GetMaximumValue(ByVal StringArr As String()) As Integer
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
Return arr.Max
End Function
Private Function GetMinimumValue(ByVal StringArr As String()) As Integer
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
Return arr.Min
End Functionوالكود التالي يوضح كيفية استخدام هاتان الدالتان
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
Dim min As Integer = GetMinimumValue(arr)
Dim max As Integer = GetMaximumValue(arr)
Me.Text = min + maxالأن كيف يمكن إستخدام ByRef فقط وأيضا نحصل علي نفس نتائج الدوال أعلاه وباستخدام روتين واحد فقط
Private Sub GetMaximumMinimumValue(ByVal StringArr As String(), ByRef max As Integer, ByRef min As Integer)
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
max = arr.Max
min = arr.Min
End Sub
نلاحظ في الكود أعلاه كيف أننا مررنا القيمتان min و max باستخدام ByRef
ولكي نستخدم الروتين أو الكود أعلاه علينا أن نقوم بتعريف المدخلات كالأتي
تعريف متغير يعبر عن String Array كالتالي
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}تعريف متغيران عبارة عن Integer ولا نعطي لهم اي قيمة
Dim min As Integer Dim max As Integer
الأن نمرر هذان المتغيران الي الروتين و سنلاحظ هنا اننا مررنا المتغيران وبالرغم من أن قيمتهم غير معرفة
GetMaximumMinimumValue(arr, max, min)
السطر التالي من الكود هو ما نحتاجه للحصول علي قيم فعلية للمتغيران min و max
حيث هنا نعيد مساواة القيم ثانية مع ما يناظرها
max = max min = min
الأن لنستخدم القيمان التي حصلنا عليهم كما نريد والكود التالي يوضح الشكل النهائي للكود من خلال فورم مثلا
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
Dim min As Integer
Dim max As Integer
GetMaximumMinimumValue(arr, max, min)
max = max
min = min
Me.Text = min + max
max = Nothing
min = Nothing
End Subبالتوفيق
مثال أخر
لنفرض أنن نريد أن نحصل علي نقطة مركز المستطيل فغالبا هنا علينا أن نمرر متغير يشير الي هذا المستطيل وتكون النتيجة التي نحصل عليها عبارة عن نقطة والكود التالي يوضح شكل الروتين المطلوب كتابته
Private Sub GetRectCenterPoint(ByVal r As Rectangle, ByRef pt As Point)
pt.X = ((r.Left + r.Right) / 2)
pt.Y = ((r.Top + r.Bottom) / 2)
End Subثم في الحدث Paintl الخاص بالفورم مثلا يمكن أن نستخدم االروتين بالشكل التالي
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف المستطيل
Dim boundRect As New Rectangle(10, 10, 100, 100)
' تعريف نقطة ما بدون اعطاؤها اي قيمة
Dim pt As Point
' تمرير النقطة الي الروتين أعلاه
GetRectCenterPoint(boundRect, pt)
' الحصول علي القيمة الفعلية لهذه النقطة
pt = pt
' ثم نرسم شيئا ما مثل المستطيل
e.Graphics.DrawRectangle(Pens.Black, boundRect)
' ثم نسخدم النقطة التي حصلنا عليها لنرسم خطا من منتصف المستطيل الي نقطة بداية المستطيل علي الفورم
e.Graphics.DrawLine(Pens.Red, pt, boundRect.Location)
' هنا يمكننا ان نعيد قيمة النقطة الي صفر او لا شئ حسب رغبتنا
pt = Nothing
End Subويمكن إعادة كتابة الروتين أعلاه بالشكل التالي أيضا
Private Sub GetRectCenterPoint(ByVal r As Rectangle, ByRef x As Integer, ByRef y As Integer)
x = ((r.Left + r.Right) / 2)
y = ((r.Top + r.Bottom) / 2)
End Subثم في الحدث Paintl الخاص بالفورم مثلا يمكن أن نستخدم االروتين بالشكل التالي
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف المستطيل
Dim boundRect As New Rectangle(10, 10, 100, 100)
' تعريف متغيران ما بدون اعطاؤها اي قيمة
Dim Xcenter As Integer
Dim Ycenter As Integer
' نمرر القيمتان الي الروتين
GetRectCenterPoint(boundRect, Xcenter, Ycenter)
' الحصول علي القيم الفعلية
Xcenter = Xcenter
Ycenter = Ycenter
' ثم نستخدم البيانات لنرسم ما نريد
' نرسم شيئا ما مثل المستطيل
e.Graphics.DrawRectangle(Pens.Black, boundRect)
' ثم نسخدم القيمتان التي حصلنا عليهما لنرسم خطا من منتصف المستطيل الي نقطة بداية المستطيل علي الفورم
e.Graphics.DrawLine(Pens.Red, New Point(Xcenter, Ycenter), boundRect.Location)
End Subبالتوفيق
شكرا لكم ...
كل شيء الان واضح بفضل الله ثم شرحكم <3
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…