06-10-12, 10:13 PM
منقول من المنتدى القديم
الكاتب احمد جمال المشرف العام
الوظيفة Out :
كما تعلمنا في المثال السابق فإننا نقوم بارجاع النتيجة من خلال return ، ماذا لو اردنا اعادة نتيجة من دالة void ، يتم ذلك باستخدام الدالة Out بالشكل التالي :
C#:
VB.net:
وعند استدعاء الدالة يتم تمرير المتغير الذي نحتاج إليه لعرض النتيجة ايضاً :
C#:
VB.net:
ولكن ما هو السبب الذي قد يدفعني لاستخدام هذه الطريقة بدلاً من استخدام return ؟
الاجابة الابسط ، هي انني لو اردت اعادة اكثر من نتيجة مثل ناتج الضرب والجمع والقسمة ، فليس امامي حل سوى اعادة مصفوفة بالارقام وقراءتها هناك ، الحل الابسط هو باستخدام out .
الارسال بالمرجع byref والارسال بالقيمة byval :
لنفترض المثال الخاص بعملية الطرح بالشكل التالي :
C#:
VB.net:
والدالة :
C#:
VB.net:
في الدالة السابقة قمنا بتغيير قيمة number1 ، ولكن هل سيغير هذا من قيمة x التي ارسلناها ، الإجابة هي بلا ، هذا ما يعرف بارسال القيمة حيث نقوم في هذه الحالة بارسال قيمة x إلى الدالة وليست قيمة X .
الارسال بالمرجع ByRef هي الحالة الثانية ، في هذه الحالة يتم ارسال عنوان المتغير X في الذاكرة إلى الدالة ، هذا ما يعني ان اي تغيير في number1 سيؤثر بالضرورة على المتغير x .
لكتابة الكود السابق بطريقة ByRef نكتب الكود التالي :
C#:
Vb.net:
الارسال بالقيمة يمكن تطبيقه فقط مع المتغيرات البسيطة ، اما المتغيرات المركبة مثل Struct فيتم التعامل معه ByRef افتراضياً ...
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
الكاتب احمد جمال المشرف العام
الوظيفة Out :
كما تعلمنا في المثال السابق فإننا نقوم بارجاع النتيجة من خلال return ، ماذا لو اردنا اعادة نتيجة من دالة void ، يتم ذلك باستخدام الدالة Out بالشكل التالي :
C#:
كود :
static void sum(int number1, int number2, out int total)
{
total = number1 + number2;
}VB.net:
كود :
Private Shared Sub sum(ByVal number1 As Integer, ByVal number2 As Integer, ByRef total As Integer)
total = number1 + number2
End Subوعند استدعاء الدالة يتم تمرير المتغير الذي نحتاج إليه لعرض النتيجة ايضاً :
C#:
كود :
int result;
sum(5, 8,out result);
Console.Write(result);
Console.ReadKey();VB.net:
كود :
Dim result As Integer
sum(5, 8, result)
Console.Write(result)
Console.ReadKey()ولكن ما هو السبب الذي قد يدفعني لاستخدام هذه الطريقة بدلاً من استخدام return ؟
الاجابة الابسط ، هي انني لو اردت اعادة اكثر من نتيجة مثل ناتج الضرب والجمع والقسمة ، فليس امامي حل سوى اعادة مصفوفة بالارقام وقراءتها هناك ، الحل الابسط هو باستخدام out .
الارسال بالمرجع byref والارسال بالقيمة byval :
لنفترض المثال الخاص بعملية الطرح بالشكل التالي :
C#:
كود :
int x=5;
int y=10;
sub(x,y);VB.net:
كود :
Dim x As Integer = 5
Dim y As Integer = 10
sub(x, y)والدالة :
C#:
كود :
static void sub(int number1, int number2)
{
number1 = number1 - number2;
return number1;
}كود :
Private Shared Sub [sub](ByVal number1 As Integer, ByVal number2 As Integer)
number1 = number1 - number2
Return number1
End Subفي الدالة السابقة قمنا بتغيير قيمة number1 ، ولكن هل سيغير هذا من قيمة x التي ارسلناها ، الإجابة هي بلا ، هذا ما يعرف بارسال القيمة حيث نقوم في هذه الحالة بارسال قيمة x إلى الدالة وليست قيمة X .
الارسال بالمرجع ByRef هي الحالة الثانية ، في هذه الحالة يتم ارسال عنوان المتغير X في الذاكرة إلى الدالة ، هذا ما يعني ان اي تغيير في number1 سيؤثر بالضرورة على المتغير x .
لكتابة الكود السابق بطريقة ByRef نكتب الكود التالي :
C#:
كود :
static void sub(ref int number1, ref int number2)
{
int result = number1 - number2;
return result;
}Vb.net:
كود :
Private Shared Sub [sub](ByRef number1 As Integer, ByRef number2 As Integer)
Dim result As Integer = number1 - number2
Return result
End Subالارسال بالقيمة يمكن تطبيقه فقط مع المتغيرات البسيطة ، اما المتغيرات المركبة مثل Struct فيتم التعامل معه ByRef افتراضياً ...
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
