متدها (Methods) در زبان برنامه‌نویسی سی شارپ‌

10 تیر 1396
درسنامه درس 8 از سری آموزش سی شارپ (C#)
csharp-methods

در فصل گذشته مفاهیم گنگ زیادی برای شما عزیزان مطرح شده است که شاید هیچ پیش فرض ذهنی نسبت به آنها نداشته باشید. اما نگران نباشید، این فصل توضیح جامع و کاملی را در ارتباط با متد ها در اختیار شما قرار می‌دهد تا مقدمه‌ی ورود به دنیای کلاس‌ها در زبان برنامه‌نویسی C# را فراهم کنیم.

مقدمه

یک متد به عنوان مجموعه‌ای از عبارات و کدها شناخته می‌شود. در زبان برنامه‌نویسی C# هر کلاس حداقل یک متد به نام Main دارد که در اکثر مثال ها و برنامه‌ها با آن آشنا شدید. متدها همواره به صورت زیر مورد استفاده قرار می‌گیرند:

  • تعریف یک متد
  • فراخوانی یک متد

یعنی باید ابتدا یک متد را تعریف کرد و سپس آن را درون مجموعه‌ی کدهای خود فراخوانی کنیم.

تعریف متد (Method)

در زبان برنامه‌نویسی سی شارپ متدها به شیوه زیر تعریف می‌شوند:

<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
   Method Body
}

برای هر المان موجود در ساختار فوق یک تعریف ارائه می‌دهیم:

Access Modifier: با مطالعه‌ی فصل ۷ متوجه خواهید شد که به عنوان یک تعیین سطح دسترسی برای متغییرها و متدها مورد استفاده قرار می‌گیرد و در ۵ نوع مختلف ارائه می‌شود.

Return type: یک متد معمولا یک مقدار را باز می‌گرداند. مقداری که بازگردانده می‌شود دارای یک نوع است و آن نوع در این محل نوشته می‌شود. اگر یک متد هیچ مقداری را باز نگرداند از نوع void تعریف می‌شود.

Method name: به عنوان یک نام واحد برای متد شناخته می‌شود. این نام به بزرگ و کوچک بودن حروف حساس است. یعنی متدی با نام Name و متدی با نام name با یکدیگر متفاوت هستند. معمولا متدها را با ساختار camelCase تعریف می‌کنند مثلا متد getValue.

Parameter list: شامل لیستی از پارامترهاست که به متد ارسال شده تا عملیات موردنظر را روی داده انجام دهد.

Method body: در این قسمت مجموعه تمام کدهای موردنیاز درج می‌شود.

در مثال زیر با یک متد که درون کلاسی تحت عنوان NumberManipulator تعریف شده است، آشنا می‌شوید:

class NumberManipulator
{
   public int FindMax(int num1, int num2)
   {
      /* local variable declaration */
      int result;

      if (num1 > num2)
         result = num1;
      else
         result = num2;

      return result;
   }
   ...
}

همانطور که ملاحظه می‌کنید این کلاس دارای یک متد با تعیین سطح دسترسی public و نوع بازگشتی int به نام FindMax تعریف شده است که آرگومان‌های num1 و num2 از نوع int را دریافت کرده و عملیات پیدا کردن بیشترین مقدار را درون Method body یا بدنه‌ی اصلی خود انجام می‌دهد.

فراخوانی متد‌ها در C#

می‌توان یک متد را فراخوانی نام آن از یک کلاس در دسترس داشت و مقادیر مختلفی را به عنوان آرگومان به آن ارسال و از ان استفاده کرد. به مثال زیر توجه کنید:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public int FindMax(int num1, int num2)
      {
         /* local variable declaration */
         int result;
         
         if (num1 > num2)
            result = num1;
         else
            result = num2;
         return result;
      }
      static void Main(string[] args)
      {
         /* local variable definition */
         int a = 100;
         int b = 200;
         int ret;
         NumberManipulator n = new NumberManipulator();

         //calling the FindMax method
         ret = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", ret );
         Console.ReadLine();
      }
   }
}

خروجی این مثال به صورت زیر خواهد بود:

Max value is : 200

یعنی شما ابتدا متد را تعریف کرده و سپس آن را درون تابع یا متد اصلی main استفاده کرده‌اید.

همچنین درنظر داشته باشید که تمام متدهای public را می‌توان درون سایر کلاس‌ها نیز استفاده کرد. مثال زیر به شما کمک می‌کند تا درک بهتری از این مفهوم داشته باشید:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public int FindMax(int num1, int num2)
      {
         /* local variable declaration */
         int result;
         
         if(num1 > num2)
            result = num1;
         else
            result = num2;
         
         return result;
      }
   }
   
   class Test
   {
      static void Main(string[] args)
      {
         /* local variable definition */
         int a = 100;
         int b = 200;
         int ret;
         NumberManipulator n = new NumberManipulator();
         
         //calling the FindMax method
         ret = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", ret );
         Console.ReadLine();
      }
   }
}

همانطور که ملاحظه کردید از متد FindMax در کلاس دیگری تحت عنوان Test استفاده کردیم. در نهایت خروجی این مثال به صورت زیر خواهد بود:

Max value is : 200

ارسال پارامترها به متدها در C#

ارسال پارامترها در زبان برنامه‌نویسی C# به سه نوع مختلف صورت می‌پذیرد:

  • پارامترهای مقداری (Value Parameters)
  • پارامترهای مرجع (Reference Parameters)
  • پارامترهای خروجی (Output Parameters)

پارامترهای مقداری (Value Parameters)

این نوع پارامترها مقادیر واقعی که به عنوان آرگومان به متدها ارسال می‌شوند را دقیقا درون تابع برده و مورد استفاده قرار می‌دهند. در مثال‌هایی که ابتدای این فصل مطرح کردیم تمام داده‌ها دقیقا به همینصورت به متد ارسال می‌شدند.

پارامترهای مرجع (Reference Parameters)

یک پارامتر مرجع به محل حافظه یک متغییر رجوع می‌کند. هنگامیکه یک پارامتر به صورت مرجع ارسال می‌شود، بر خلاف پارامترهای مقداری، یک فضای جدید ایجاد نمی‌شود. پارامترهای مرجع در یک حافظه یکسان و متناسب با پارامتر اصلی و واقعی نمایش داده می‌شوند که به این متد اعمال می‌شوند. پارامترهای مرجع را با استفاده از کلیدواژه‌ی ref تعریف می‌کنند. و هر آنچه روی مقدار واقعی تغییر کند به علت اینکه پارامتر مرجع به آن حافظه و خانه رجوع می‌کند، مقدارش تغییر کرده و برابر مقدار واقعی می‌شود. به مثال زیر توجه کنید:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void swap(ref int x, ref int y)
      {
         int temp;

         temp = x; /* save the value of x */
         x = y;    /* put y into x */
         y = temp; /* put temp into y */
      }
   
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* local variable definition */
         int a = 100;
         int b = 200;

         Console.WriteLine("Before swap, value of a : {0}", a);
         Console.WriteLine("Before swap, value of b : {0}", b);

         /* calling a function to swap the values */
         n.swap(ref a, ref b);

         Console.WriteLine("After swap, value of a : {0}", a);
         Console.WriteLine("After swap, value of b : {0}", b);
 
         Console.ReadLine();

      }
   }
}

ابتدا مقادیر a و b برابر ۱۰۰ و ۲۰۰ است ولی هنگامیکه متد swap اعمال می‌شود. مقادیر a و b با یکدیگر جابه‌جا می‌شود و اگر مجددا مقدار a و b را مشاهده کنیم، متوجه می‌شویم که تغییر کرده‌اند. یعنی پارامترهای ارجاع اگر تغییر کنند، پارامترهای اصلی نیز دچار تغیر شده و مقادیری را نمایش می‌دهند که در متد با پارامترهای ارجاع پیاده سازی می‌شود. در نهایت خروجی این مثال به صورت زیر می‌باشد:

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100

پارامترهای خروجی (Out Parameters)

متدها همواره و در حالت پیش فرض تنها یک مقدار را باز می‌گردانند حال اگر بخواهیم دو مقدار را از یک متد بازگردانیم از روش پارامترهای خروجی استفاده می‌کنیم. پارامترهای خروجی را با کلمه‌ی کلیدی out تعریف می‌کنند. مثال زیر را با یکدیگر بررسی می‌کنیم:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValue(out int x )
      {
         int temp = 5;
         x = temp;
      }
   
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* local variable definition */
         int a = 100;
         
         Console.WriteLine("Before method call, value of a : {0}", a);
         
         /* calling a function to get the value */
         n.getValue(out a);

         Console.WriteLine("After method call, value of a : {0}", a);
         Console.ReadLine();

      }
   }
}

در این مثال ابتدا مقدار a برابر ۱۰ تعریف شده و سپس با اعمال متد پارامتر a مقداری برابر ۵ را خواهد داشت و به عنوان خروجی در دسترس است در نهایت خروجی این مثال به صورت زیر خواهد بود:

Before method call, value of a : 100
After method call, value of a : 5

یکی دیگر از مزیت‌های استفاده از پارامترهای out این است که برای این پارامترها نیازی به مقداردهی اولیه نیست. یعنی حتما نباید در ابتدا بنویسیم int a=100. در مثال زیر متغییرهای a و b مقداردهی نشده‌اند و پس از ورود به متد getValues مقادیر آنها توسط ورودی از کاربر دریافت و در نهایت چاپ می‌شود:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValues(out int x, out int y )
      {
          Console.WriteLine("Enter the first value: ");
          x = Convert.ToInt32(Console.ReadLine());
          Console.WriteLine("Enter the second value: ");
          y = Convert.ToInt32(Console.ReadLine());
      }
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* local variable definition */
         int a , b;
         
         /* calling a function to get the values */
         n.getValues(out a, out b);
         
         Console.WriteLine("After method call, value of a : {0}", a);
         Console.WriteLine("After method call, value of b : {0}", b);
         Console.ReadLine();
      }
   }
}

در نهایت خروجی به صورت زیر خواهد بود:

Enter the first value:
7
Enter the second value:
8
After method call, value of a : 7
After method call, value of b : 8

در این بخش شما یاد گرفتید که چگونه یک متد را تعریف و مورد استفاده قرار دهید. بخش بعدی را به توضیح مفصل کلاس‌ها و مفاهیم شیءگرایی می‌پردازیم تا شما عزیزان به دنیای حرفه‌ای برنامه‌نویسی قدم بگذارید. با ما همراه باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Touran Azadbeigi
26 تیر 1398
بسیار عالی توضیح داده اید ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.