الدوال في سي شارب

مؤمل محمد راضيمنذ سنتين

     الدوال في C#

 

ان للدوال اهمية كبيرة في عملية البرمجة فهي تخدم المبرمج بشكل كبير حيث انها اعطته امكانية واسعه لادارة مشروعه , وتحل مشكلة تكرار الاسطر والاوامر البرمجية فيمكن له استدعاء مجموعه من الاوامر الموجودة داخل قوسي الدالة {}

عدة مرات بمجرد ذكر اسم الدالة , سابقا لم يكن هنالك دوال فكانت عملية البرمجة تستغرق وقت طويل جدا غير انها مجهدة كثيرا ومكلفه وعملية التعديل على الكود  و عملية اكتشاف الاخطاء كان امرا معقدا لانها تضم اكثر من 1000 سطر برمجي على سبيل المثال  فضهرت الدوال لتحل هذه المشكلة

وتعرف الدالة على انها قطعه برمجية تحمل اسما وخصائص معينه تبدا بقوس وتنتهي بقوس اخر ..

عادة كلما قمت بتعريف دالة في C # ، تحتاج إلى الإشارة إلى قيمة الإرجاع(return) الخاصة بها. يمكن أن تكون قيمة الإرجاع هذه من أي نوع بيانات اعداد صحيحة او اعداد عشرية وما الى ذلك   ، تجدر الاشارة هنا الى ان في حالة إرجاع أي قيمة ، لا يتم ذلك. ضمن الدالة ، لإنهاء تنفيذها ، مما يؤدي إلى قيمة ، يتم استخدام return) )الكلمة الأساسية متبوعًا بالقيمة المطلوب إعادتها. و استخدام الارجاع يؤدي إلى الإنهاء الفوري لهذه الطريقة.

 

يوجد عدة انواع من الدوال فهذا النوع خاص بارجاع قيمة للمستخدم ولهذا قمنا بكتابة (string[] args ( , عادة مانرى هذه الدالة موجودة افتراضيا سواء في المحرر Visual BASIC او في monodevelop . يجب أن يتم التصريح عن الطريقةMain)) على سبيل المثال و كما هو موضح أعلاه ، يجب أن تكون ثابتة، ويجب أن يكون لها اسم رئيسي وكقائمة من المعلمات يجب أن يكون لها معلمة واحدة فقط من من السلسلة. في مثالنا ، تُسمى المعلمة args ولكن هذا غير إلزامي. لا يتم استخدام هذه المعلمة في معظم الحالات حتى يمكن حذفها (وهي اختيارية). في هذه الحالة ، يمكن تبسيط نقطة دخول البرنامج وستظهر بالشكل التالي:

 

 

لاحض اننا كتبنا الامر  *

 التابع لمجموعه   WriteLine

Console داخل قوسي الدالة {} لكي نطبع جملة "مرحبا بالعالم ".

* تشير الأقواس الفارغة إلى أن الطريقة لا تتطلب أية معلمات.

* نلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

هنالك قواعد بسيطة يجب الانتباه لها عند كتابة اي دالة :-

- لايمكنك كتابة دالة داخل دالة اخرى

يجب كتابتها بالشكل الاتي

 

- يتم الإعلان عن الطرق في فئة أو هيكل عن طريق تحديد مستوى الوصول مثل عام أو خاص ، ومعدلات اختيارية مثل الملخص أو المختومة ، وقيمة الإرجاع ، واسم الطريقة ، وأية معلمات طريقة. هذه الأجزاء معا هي التوقيع على هذه الطريقة.

- عادة يجب ان تحتوي المعلمة في أسلوب ملحق دائمًا على الكلمة "this" التي تسبق النوع الذي تحتاج إليه الطريقة

 

 

 

- يجب ان يبدأ اسم الدالة بحرف كبير

 

      

 

 

 

 

 

 

 

تنيسق الدوال :-

يمكننا ان نوضح النتسيق وطريقة كتابة الدالة في التالي :-

 

[static] <return_type> <method_name>([<param_list]

 

   قائمة المعلمات   اسم الدالة (الاسلوب)      نوع الارجاع  ]  الثابت [

 

هناك بعض العناصر الإلزامية لإعلان الطريقة: - نوع النتيجة ، التي يتم إرجاعها بواسطة الطريقة - <return_type>. - اسم الأسلوب - <method_name>. - قائمة المعلمات إلى الطريقة - <param_list> - يمكن أن تكون قائمة فارغة أو يمكن أن تتكون من سلسلة من إعلانات المعلمات. لتوضيح عناصر تعريف الطريقة ، يمكننا استخدام الأسلوب Main (…) في عرض HelloCSharp  :

 

كما يتبين من أن قيمة القيمة المرجعه لاغية" void " (بمعنى أن هذه الطريقة لا تؤدي إلى نتيجة) ، فإن اسم هذه الطريقة هو الرئيسي ، متبوعًا بأقواس دائرية ، بينها قائمة بمعلمات الطريقة. في المثال الخاص هو في الواقع معلمة واحدة فقط - سلسلة الوسيطة [] args. يتم تعريف التسلسل الذي يتم كتابة عناصر منه بطريقة دقيقة. دائمًا ، في المقام الأول ، هو نوع القيمة التي ترجعها الطريقة <return_type> ، متبوعةً باسم الأسلوب <method_name> وقائمة المعلمات في النهاية <param_list> الموضوعة بين أقواس دائرية - "(" و " ) ". بشكل اختياري ، يمكن أن تحتوي التعريفات على معدِّلات الوصول (مثل عامة وثابتة).

ان أسماء الأسلوب تحل كل طريقة مهمة جدا يتم استخدام اسم الطريقة عندما يتم استدعاء الطريقة. عندما نسمي (نبدأ) طريقة معينة ، نكتب اسمها وإذا لزم الأمر نمرر القيم (إن وجدت). في المثال أدناه ، يكون اسم طريقتنا هو PrintLogo:

 

 

 

 

* عند إعلان دالة ما ، احتفظ بتسلسل وصف عناصرها: أولاً هو نوع القيمة التي ترجعها الطريقة ، ثم يكون اسم الأسلوب ، وفي النهاية قائمة المعلمات الموضوعة بين قوسين مستديرين.

 

 

 

* لتسمية الدالة ، من الجيد اتباع هذه القواعد:

- يجب أن يصف اسم الأسلوب غرض الدالة.

- يجب أن يبدأ اسم الطريقة بحرف كبير.

 

 

استدعاء الدالة داخل الكود البرمجي :-

 

في البداية سنقوم بالتطبيق على الـ firstName فقط ، سنستدعي الدالة ليقوم بعرض الموجود داخلها .

المتغير الأول هو السؤال و المتغير الثاني هو ناتج المدخل

الآن سيقوم بطباعة السؤال و ثم يكون بعملية عكس للأحرف المدخلة في الجواب

حيث يقوم بتحويله لمجموعة من character  و اسنادها في متغير جديد ثم يقوم بعكسها باستخدام الدالة Array.Reverse

و في النهاية سيقوم بطباعة firstNameArray

الآن لدينا الجزء المتكرر في كل المراحل السابقة و قد أصبح ضمن الدالة التي قمنا بإنشائها

الآن نقوم بعملية استدعاء للدالة التي قمنا بإنشائها

عندها سيسأل عن الاسم الأول و يطلب إدخاله ، و سيأخذ القيمة من المستخدم و يدخلها في متغير نصي  و يتابع

عند تشغيل التطبيق سيسأل عن الاسم و عند ادخال osama  يقوم بطباعة osama لكن بالشكل المعكوس … أي  amaso

الآن لنلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

لاحظ أنه سيكون لدينا مشكلة إذا قمنا بكتابة هذه الدالة للاسم الثاني و اسم المدينة

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

نحن نريد أن يقوم بإرجاع القيمة الناتجة و استخدامها لاحقا

فقد تكلمنا أن الـ void بانه لا يرجع أي قيمة ، لكن بإمكاننا استبدال هذا النوع بـ string

أي أن هذه الدالة ستقوم بعمليات معينة ثم ستعيد نصاً إلى مكان استدعائها

بما أن هذه الدالة أصبحت من النوع string  و ليس void  فيجب أن ترجع قيمة و بالتالي ستحتوي على return لشيء ما في نهايتها

و القيمة التي نريد ارجاعها هي النص الموجود لدينا  فيصبح السطر الأخير :

;Return string.concat(firstNameArray)

DisplayResult عندها سيكون هذا السطر راجعاً من الدالة

أي أنني في الأعلى يمكنني أن أقوم بتعريف

 

;()string firstName = DisplayResult

و النوع الموجود قبل إشارة المساواة من النوع string وبالتالي DisplayResult ذات الأمر ، لأن الدالة الموجودة في الأسفل من النوع string و النتيجة الراجعة من النوع string

نقوم بتشغيل التطبيق لنتأكد من صحة المعلومات و نلاحظ أنني لا اريد أن أقوم بطباعة الناتج داخل الدالة الثانية بل سأقوم بطباعته في الدالة void

فعلا قام التطبيق بطباعة osama  بشكل معكوس

سنلاحظ بعد قليل أن هذه الدالة قامت باختصار كاف الاسطر السابقة

و نتذكر أن الدوال من الممكن أن تكون int , string أو أي نوع من أنواع البيانات و يمكن أن تكون دالة لا ترجع قيمة مثل void

الشرط الأساسي أنه إذا لم تكن من النوع void فيجب عليك أن تقوم بإرجاع قيمة و هذه الدالة قامت بعمليات معينة و قامت بإرجاع الناتج النهائي

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

الآن أريد استخدام هذه الدالة ليس فقط لطباعة الاسم الأول

بل لطباعة الاسم الأول و الأخير و السؤال عن المدينة التي ولد فيها

إذا في الدالة يمكنك أن تقوم بإرسال قيمة

لذلك سنقوم بتعريف متغير جديد

عندما نقوم باستدعاء الدالة يجب أن نرسل قيمة يتم ارسالها إلى الدالة

لذلك سنقوم بحذف السؤال في الدالة و نجعله قادماً من مكان استدعائها

إذا سنأخذ المتغير question و نضعه بعد string  بين قوسي الدالة (  )

الناتج كالتالي

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

الآن قمنا بإرسال هذا النص إلى الدالة و قام بطباعته و استخدام القيمة المرسالة مع هذه الدالة

نقوم بتعريف متغير جديد اسمه lastName ، و سأسأله سؤال ” ما هو اسمك الأخير” و القيمة الراجعة من الدالة سيقوم بإسناده للمتغير lastName

ثم نسأله عن مكان الولادة

لاحظو أن هذه الثلاث أسطر هي فعليا 12 سطر

لنتأكد أن القيمة الراجعة صحيحة

ثم نقوم بطباعة الناتج النهائي

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

 

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

حيث استخدمناها لتقليل عدد الأسطر

وهنا تكمن فائدة الدوال .

 

 

 

 

طريقة حساب مجموع أسعار الكتب- مثال

لنلقِ نظرة على مثال آخر لتوضيح ذلك. تخيل أننا في محل لبيع الكتب ونريد أن نحسب المبلغ الذي يجب أن ندفعه مقابل جميع الكتب التي اشتريناها. سننشئ دالة تحصل على أسعار جميع الكتب كصفيف من النوع العشري [ ] ، ثم تعيد المبلغ الإجمالي الذي يجب أن ندفعه :

تحديد طريقة الدالة وفقا لإدخالها :-

عندما يتم الإعلان عن دالة مع المعلمات ، فإن هدفنا هو أنه في كل مرة نستدعي فيها الطريقة ، تتغير النتائج وفقًا للمدخلات. بتعبير اخر ، الخوارزمية هي نفسها ، ولكن بسبب تغيير المدخلات ، تتغير النتيجة أيضا

تجدر الاشارة هنا انه عندما يكون للدالة معلمات ، يعتمد سلوكها على قيم المعلمات

 

طريقة إظهار ما إذا كان الرقم موجبًا - مثال :-

لتوضيح الدالة التي يعتمد بها تنفيذ الدالة على المدخلات ، فلنلق نظرة على مثال آخر. يحصل الأسلوب على إدخال عدد int من int ، ووفقًا له فإنه يعود إلى وحدة من التحكم  :   "Positive" أو "Negative" أو "Zero"

 

.

 

 

 

 

 سنتطرق لشرح الادوات الشرطية في الفصل التالي هذا المثال للتوضيح*

دالة مع معلمات متعددة

 حتى الآن كان لدينا بعض الأمثلة عن الطرق مع قوائم المعلمات التي تتكون من معلمة واحدة. عندما يتم الإعلان عن طريقة ، ومع ذلك ، يمكن أن يكون لها كمعلمات متعددة كما يحتاج الأسلوب. إذا كنا نطلب الحد الأقصى لقيمتين ، على سبيل المثال ، تحتاج الطريقة إلى معلمتين:

 

 

 

 

 

 

كيفية تحديد دالة مع عدد متغير من الوسيطات :-

بشكل رسمي ، يكون إعلان دالة ذات عدد متغير من الوسيطات مماثلًا لإعلان أي دالة أخرى:

   قائمة المعلمات   اسم الدالة (الاسلوب)      نوع الارجاع   ] الثابت [

 

  ويكمن الاختلاف في أن المعلمات معلنة بكلمة رئيسية  بالطريقة الموضحة أدناه:

 

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

 

 

 

 

 

المعلمات الاختيارية والوسائط المسماة :-

تعتبر الوسائط المسماة والمعلمات الاختيارية وظيفتين مختلفتين للغة C #. ومع ذلك ، غالبا ما يتم استخدامها معا. يتم تقديم هذه المعلمات في C # ، الإصدار 4.0. تسمح المعلمات الاختيارية بتخطي بعض المعلمات عند استدعاء إحدى الدوال. الوسيطات المسماة على جانبها ، تسمح بضبط قيم معلمات الدالة حسب أسمائها ، بدلاً من موضعها الدقيق في قائمة المعلمات. هذه الميزات في بناء لغة C # مفيدة للغاية في حالة استدعاء دالة مع مجموعة مختلفة من المعلمات.

يمكن أن يتم الإعلان عن المعلمات الاختيارية فقط باستخدام قيمة افتراضية بالطريقة المبينة أدناه :

في المثال أعلاه y و z اختياريان ويمكن تخطيهما عند استدعاء الاسلوب :

يمكننا تمرير قيمة من خلال اسم معلمة معين ، عن طريق تعيين اسم المعلمة ، متبوعًا بنقطتين وقيمة المعلمة. مثال على استخدام الوسائط المسماة موضح أدناه :

 

 

 

جميع الاستدعاءات في النموذج أعلاه مكافئة لبعضها البعض

- يتم تخطي المعلمة y ، ولكن يتم تعيين x و z إلى 1 و 3. والفرق الوحيد بين الاتصال الثاني والثالث هو أن قيم المعلمات يتم حسابها بنفس الترتيب مرر إلى الدالة ، في آخر استدعاء 3 سيتم احتسابه قبل 1. في هذا المثال ، تكون جميع المعلمات ثوابت والغرض منها هو فقط لتوضيح فكرة المعلمات الاسمية والاختيارية.

الدوال من نوع (التحميل الزائد)للدالة  :-

عندما يتم الإعلان عن دالة في فئة ما ويتزامن اسمها مع اسم دالة أخرى ، إلا أن تواقيعها تختلف حسب قائمة المعلمات الخاصة بها (عدد معلمات الطريقة أو الطريقة التي يتم ترتيبها بها) ، نقول إن هناك اختلافات / حمولة زائدة مختلفة من هذه الطريقة (طريقة التحميل الزائد). على سبيل المثال ، لنفترض أننا يجب أن نكتب برنامجًا يرسم الحروف والأرقام على الشاشة. يمكننا أيضا أن نفترض أن برنامجنا يحتوي على طرق لسحب سلاسل String)) ، والأعداد الصحيحة - ((Int ، وألارقام العشرية - ((Float وهكذا:

 

فهو الإعلان عن دوال متعددة تحمل الاسم نفسه مع معلمات مختلفة ، يشار إليها باسم التحميل الزائد للدالة. يمثل التحميل الزائد للطريقة عادة وظائف متماثلة في الغرض منها ، ولكن يتم كتابتها لقبول أنواع الدوال المتشابهه في اسمائها و المختلفة في معلماتها.

 

معلمات الدالة وتوقيع الدالة :-

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

على سبيل المثال ، في C # ، يكون التعريفان التاليان عبارة عن تعريفات لدالة واحدة . ذلك لأن نوع المعلمة في كل معلماتها هو نفسه - int و float. وبالتالي ، فإن أسماء المتغيرات التي نستخدمها - param1 و param2 أو p1 و p2 ، ليست مهمة:

 

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

Type '<the_name_of_your_class>' already defines a member called 'DoSomething' with the same parameter types.

 

إذا قمنا بتغيير نوع المعلمة من موضع معين من قائمة المعلمات إلى نوع مختلف ، في C # ، فسيتم اعتبارهما دالتين مختلفتين تمامًا ، أو بشكل أكثر دقة ، اختلافات مختلفة لدالة بنفس الاسم. على سبيل المثال ، إذا كان في الدالة الثانية ، المعلمة الثانية من قائمة المعلمات لأي من الطرق - float p2 ، لا يتم الإعلان عنها على أنها (متغير عشري   float ) ، ولكن على سبيل المثال ، سيكون لدينا طريقتين مختلفتين بتواقيع مختلفة - DoSomething (int) اعداد صحيحة ) و DoSomething (int ، int). والآن يختلف العنصر الثاني من قائمة معلمات التوقيع الخاصة به ، بسبب اختلاف نوع العنصر الثاني:

 

 

 

 

في هذه الحالة ، حتى لو قمنا بكتابة نفس الاسم للمعلمات ، سيقبل المترجم هذا الإعلان ، لأنه دالة مختلفة عمليا:

سيقبل المحول البرمجي الكود مرة أخرى إذا أعلنا عن شكلين من الدالة  ، لكننا سنغيّر هذه المرة ترتيب المعلمات بدلاً من نوعها.

في المثال أعلاه يختلف ترتيب أنواع المعلمات وهذا يجعل التوقيع مختلفًا أيضًا. بما أن قوائم المعلمات مختلفة ، فإنها لا تلعب أي دور أن الاسم (DoSomething) هو نفسه لكلتا الطريقتين. لا يزال لدينا توقيعات مختلفة لكلتا الطريقتين .

 

إرجاع نتيجة من الدالة :-

حتى الآن ، تم إعطاءنا دائمًا أمثلة ، حيث تعمل الدالة على شيء بسيط مثل الطباعة او القرائة على وحدة التحكم ، ولا شيء أكثر من ذلك. ومع ذلك ، لا تقوم الدوال عادةً فقط بتنفيذ تسلسل بسيط للكود البرمجي ، ولكن بالإضافة إلى ذلك فإنها في كثير من الأحيان ترجع النتائج. لذلك دعونا نلقي نظرة على كيفية حدوث ذلك بالفعل.

 

- الإعلان عن دالة إرجاع نتيجة

لاحض التنسيق الاتي :

[Static] <return_type> <method_name>(<parameters_list)

 

في وقت سابق قلنا أنه في مكان <return type> سنقوم دائما بجعله (void). الآن سنمد هذا التعريف ، ، هذا الفراغ (void) ليس هو الخيار الوحيد. بدلاً منه يمكننا إرجاع أي نوع إما بدائي (int أو float أو double أو ...) أو بالإشارة (كسلسلة أو صفيف "مصفوفه") ، اعتمادًا على نوع النتيجة التي ستعود بها الدالة بعد تنفيذها. على سبيل المثال ، استخدم دالة  تحسب   مساحة   المربع وبدلاً من طباعتها إلى وحدة التحكم ، تقوم بإرجاعها كنتيجة. لذا ، سيبدو الإعلان عنها كما يلي:

 

 

 

 

انشاء ملف

 

 

 

 

 

 

 

 

 

 

 

المحاضر

مؤمل محمد راضي

الكلمات الدليلية

عن الدرس

0 إعجاب
1 متابع
0 مشاركة
3694 مشاهدات
منذ سنتين

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !