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

ممكن شرح عمل by val و by ref

بدأه RANDOOM في 2 ديسمبر 2010 · 5 رد · 1,518 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ممكن شرح طريقة عمل الـ by val و by ref

ماهي وظيفتهاا .. و الفائده منها في ايش من البرامج ؟

و مالمقصوود بإن يأتي قبــل by val كلـمة optional ؟؟

اتمنى يكون الشرح مبسط لإنني مبتدئه ....... :)

شكرا و يعطيكم العافيه ~ :happy:

#2

اتمنى سرعة الرد منكم ........ :happy:

#3

عليكم السلام

بسيطة اختي :happy:

تتعلق بتمرير المقترحات(قيم وكائنات) إلى داخل الدوال (الروتينات)

by val

هي لتمرير نسخة من القيمة بحيث أن عملية الدالة(الروتين) على هذه النسخة لا تؤثر على المتغير الحقيقي المُمرر(الداخل) على هذه الدالة(الروتين) وإنما نسخة منه فقط

وهي تعني By Value (التمرير بواسطة القيمة)

by ref

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

وهي تعني By Reference (التمرير بواسطة مرجع)

Optional by val

هو إذا أردنا إنشاء مقترحات للروتين ذات قيم استهلالية معينة بحيث إذا تجاهلناها عند الإستدعاء لا تؤثر بالخطأ في عمل الروتين بل ستتعامل مع تلك القيم الإستهلالية

في الرابط تجدين نقاشات حول الموضوع مع الأمثلة

من هنا

تابعي المشاركات فضلاً من الرابط السابق...

آسفة مو بالعادة اكتب روابط خارجية ولكن لست متخصصة في هذه اللغة وليست لدي أمثلة وانتي مستعجلة شوي :happy:

وإن كانت هذه مفاهيم برمجية عامة

موفقة يارب

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#4

سأحاول أن أوضح لك الأمر بمثال كالتالي

ملحوظة هامة الكود أدناه يحتاج الفيجوال استوديو 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

بالتوفيق

#5

مثال أخر

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

  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

بالتوفيق

#6

شكرا لكم ...

كل شيء الان واضح بفضل الله ثم شرحكم <3

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…