المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس السابع : الدوال والطرق .net 2008


khaledbelal
02-17-2010, 04:42 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

في الجزء الأول من درسنا لهذا الاسبوع تعرفنا على كيفية تشتغيل Visual Studio .net 2008 ، كان آخر خطواتنا في الدرس السابق ان قمنا بكتابة جملة Hello world وطبعناها على الشاشة ، ضمن باقي دروس هذا الاسبوع سنفهم كيف قمنا بكتابة هذه الجملة وما هو الكلاس .. الدول والتعامل معها وخلافه .

بسم الله نبدا ...

لنفهم برنامجنا الأول :

لو لاحظنا برنامجنا الأول لطباعة جملة Helow World والذي كان بالشكل التالي :

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.Write("Hello World");
Console.ReadKey();
}
}
}

Vb.net:

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Namespace ConsoleApplication4


Class Program


Private Shared Sub Main(ByVal args As String())


Console.Write("Hello World")

Console.ReadKey()

End Sub

End Class

End Namespace

اول ما سنجده هو استيراد المكتبات التي سنستخدمها لكتابة اكوادنا باستخدام using أو Imports في الفيجوال بيسك ، قمنا بشرح هذه الخطوة في دروس سابقة .

الجزء الثاني هو تعريف ال name space الخاص ببرنامجنا وهو الاسم الذي توضع تحته كل مكونات البرنامج ، ومن ثم ال Class الاساسي لدينا باسم Main ... كما تعلمنا في اي مبادئ للبرمجة كائنية التوجه فإن أي برنامج يتكون من واحد او اكثر من ال Classes ، الدالة الرئيسية في ال Class المسمى Main هي الدالة main والتي يتم تنفيذها اول شيء في البرنامج .

تستقبل الدالة Main مجموعة من الباميتير تحت اسم args ، معنى هذا ان البرنامج يستقبل مع تشغيله مصفوفة من args[0] إلى args[n] ، يمكن ارسال كل ما تريد إلى البرنامج من خلالها ، وهو ما يسمى Command Line Parameters .

لكي لا نبعد عن مسارنا في الشرح ، ال Command Line Args هي مجموعة من المتغيرات التي يمكن تمريرها للبرنامج وقت تشغيله لتتحكم في بعض النقاط ، مثلاً لو قمنا بكتابة الامر التالي :

Explorer "http://www.vb4arab.com"

اول ما يتم فتح برنامج Expolorer ، يقوم بقراءة النص الممرر له ، إذا كان موقع انترنت يقوم بفتحه بالشكل المعهود لمتصفح الانترنت ، اما لو كان مسار مثلاً C:/ فسيقوم بفتح متصفح المجلدات مع انهم نفس البرنامج في النهاية .

تستطيع تجربة ذلك على برنامجك من خلال قراءة المتغيرات الممرة له عن طريق For Loop :

C#:

for (int i = 0; i < args.Length; i++)
Console.WriteLine(args[i]);

Vb.net:

For i As Integer = 0 To args.Length - 1
Console.WriteLine(args(i))
Next

الآن قم بالذهاب إلى Run ، قم بكتابة مسار برنامجك ومن ثم مسافة ومن ثم كتابة البارميترات التي ترغب في تمريرها ، في جهازي كتبت الامر التالي في Run :

C:\Users\Ahmed\********s\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplicati on4\bin\Debug\consoleapplication4.exe ahmed ali

الناتج الذي ظهر لي كان بالشكل التالي :

http://vb4arab.com/vb/uploaded/3/01203790554.jpg

كتطبيق سريع ، سنقوم بقراءة المتغير الأول وفي حالة وجود 0 مثلاً يتم تلوين خلفية الكلام بالازرق ، وفيما عدا ذلك يتم تلوين خليفة الكلام بالأحمر ، هذا هو الكود الخاص بذلك :

C#:

if (args[0] == "0")
{
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("0 enterd");
}
else
{
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine("Empty");
}
Console.ReadKey();

VB.net:

If args(0) = "0" Then


Console.BackgroundColor = ConsoleColor.Blue


Console.WriteLine("0 enterd")
Else



Console.BackgroundColor = ConsoleColor.Red


Console.WriteLine("Empty")
End If
Console.ReadKey()

تواجهنا هنا مشكلة ، ماذا لو لم نقم بتمرير اي متغيرات .. ستظهر لك رسالة خطا ، إذن نحن بحاجة للتأكد من وجود بارمتيرس قبل قراءتها ، سنقوم بذلك عن طريق التأكد من وجود متغيرات ، إذا كان هناك فيتم التأكد من كونها صفر ، إذا اختل اي من الشرطين نلجأ للون الثاني :

C#:


if (args.Length > 0)
{
if (args[0] == "0")
{
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("0 enterd");
}
}
else
{
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine("Empty");
}
Console.ReadKey();

VB.net:


If args.Length > 0 Then


If args(0) = "0" Then


Console.BackgroundColor = ConsoleColor.Blue


Console.WriteLine("0 enterd")

End If
Else



Console.BackgroundColor = ConsoleColor.Red


Console.WriteLine("Empty")
End If
Console.ReadKey()

هناك حل آخر ، ماذا لو احببنا ان نجعل التأكد في سطر واحد بالشكل التالي :

C#:

if (args.Length >0 && args[0] == "0")

VB.net:

If args.Length > 0 AndAlso args(0) = "0" Then

هذا يعني انه سيتأكد من وجود بارميترس ، إذا وجدها سينتقل للشرط الثاني وإذا لم يجدها فإنه يخرج مباشرة دون قراءة الشرط الثاني ...
الجدير بالذكر ان المعامل And لن يمكن تطبيقه في VB.net ، بل ستضطر لاستخدام AndAlso ، تجد عنها شرحاً هنا بقلم الأخ احمد بدر :
http://vb4arab.com/vb/showthread.php?t=541

الدوال Function :

كما شاهدنا في دالة Main ، يمكننا انشاء اي عدد من الدوال بأي عدد من المتغيرات ، كل ما نحتاج إليه هو معرفة البارمتيرات التي نريد لها ان تصل للدالة ، وايضاً الناتج الخارج منها ، لنفترض مثلاً اننا نصمم دالة لعملية الجمع ، تستقبل رقمين int وتخرج ناتج int ، ستكون الدالة بالشكل التالي :


C#:

static int sum(int number1, int number2)
{
int total = number1 + number2;
return total;
}

VB.net:

Private Shared Function sum(ByVal number1 As Integer, ByVal number2 As Integer) As Integer

Dim total As Integer = number1 + number2

Return total

End Function

ومن ثم ، سنحاول من خلال Main استدعائها بالشكل التالي مثلاً :


C#:

nt result = sum(5, 8);
Console.Write(result);
Console.ReadKey();

Vb.net:

Dim result As Integer = sum(5, 8)
Console.Write(result)
Console.ReadKey()

لماذا تم تعريف sum على انها Static أو Shared ؟؟ السبب انه لا يمكن استدعاء دالة غير Static من خلال دالة static ، وبما ان دالة Main هي من نوع static فلا بد من ان تكون اي دالة اخرى يتم استدعائها من خلال ال main هي static ايضاً ، سنتعرف على بعض التفاصيل الاضافية لاحقاً ، ما ينطبق على static في C# ينطبق على VB.net ايضاً مع Shared .


المتغيرات Variables :

في اي جزء من البرنامج داخل ال Class يمكننا تعريف المتغيرات حسب النوع int , string مثلاً ، ويتم تحديد مدى الوصول عبر المكان الموجود فيه التعريف .
لتوضيح هذه النقطة نعود لمثال الجمع السابق ، في المثال السابق نجد المتغير total في الدالة sum ، هذا المتغير لن يستطيع أحد الوصول إليه إلا خلال الدالة ، أما لو قمنا بتعريف متغير خارج الدالة ( داخل الكلاس مباشرة ) فيمكن لاي دالة الوصول إليه مباشرة ، في هذه الحالة يسمى Member .

- سنتعرف على بعض التفاصيل الاضافية لاحقاً .

لدينا نوعين من المتغيرات ، النوع الأول وهو البسيط مثل int و Long وخلافه حيث يتم يشير اسم المتغير لمكانه من الذاكرة أما المركب مثل Array و Struct فيشير المتغير إلى مكان تستطيع منه الاشارة إلى المتغير في الذاكرة .

الطرق mehtods :

الطرق هي الدالة التي لا تعيد ناتج ، مثل دالة عرض كتابة رسالة بالشكل التالي :

C#:لماذا تم تعريف sum على انها Static أو Shared ؟؟ السبب انه لا يمكن استدعاء دالة غير Static من خلال دالة static ، وبما ان دالة Main هي من نوع static فلا بد من ان تكون اي دالة اخرى يتم استدعائها من خلال ال main هي static ايضاً ، سنتعرف على بعض التفاصيل الاضافية لاحقاً ، ما ينطبق على static في C# ينطبق على VB.net ايضاً مع Shared .


المتغيرات Variables :

في اي جزء من البرنامج داخل ال Class يمكننا تعريف المتغيرات حسب النوع int , string مثلاً ، ويتم تحديد مدى الوصول عبر المكان الموجود فيه التعريف .
لتوضيح هذه النقطة نعود لمثال الجمع السابق ، في المثال السابق نجد المتغير total في الدالة sum ، هذا المتغير لن يستطيع أحد الوصول إليه إلا خلال الدالة ، أما لو قمنا بتعريف متغير خارج الدالة ( داخل الكلاس مباشرة ) فيمكن لاي دالة الوصول إليه مباشرة ، في هذه الحالة يسمى Member .

- سنتعرف على بعض التفاصيل الاضافية لاحقاً .

لدينا نوعين من المتغيرات ، النوع الأول وهو البسيط مثل int و Long وخلافه حيث يتم يشير اسم المتغير لمكانه من الذاكرة أما المركب مثل Array و Struct فيشير المتغير إلى مكان تستطيع منه الاشارة إلى المتغير في الذاكرة .

الطرق mehtods :

الطرق هي الدالة التي لا تعيد ناتج ، مثل دالة عرض كتابة رسالة بالشكل التالي :

C#:

void printmsg(string msg)
{
Console.WriteLine(msg);
}

في الفجيوال بيسك 6 ، كان يتم تعريف الطريقة باسم Sub ، وهو المستمر ايضاً مع VB.net ليكون بالشكل التالي :

VB.net:


Private Sub printmsg(ByVal msg As String)

Console.WriteLine(msg)

End Sub

الوظيفة 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;

}

VB.net:

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 افتراضياً ...


والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .