نحوه بازگشت چند مقدار از یک تابع در #C

سه شنبه 13 مرداد 1394

در این مقاله می خواهیم روش های مختلف برای بازگشت چند مقدار از یک تابع در #C را بررسی کنیم. در زمان هایی ما نیاز داریم که چند مقدار را از یک تابع فراخوانی شده داشته باشیم.

نحوه بازگشت چند مقدار از یک  تابع در #C

 توابع در #C شامل بدنه و نوع برگشتی می باشند. پارامترها به تابع فرستاده می شوند. بدنه تابع شامل دستوراتی است که وقتی تابع فراخوانی شود، اجرا می شوند. نوع برگشتی، مقداری است که تابع فراخوانی شده برمی گرداند..

با استفاده از 3 روش آمده در زیر می توانیم چندین مقدار را از یک تابع بازگشت دهیم.

پارامترهای Reference

پارامترهای output

بازگشت آرایه

بازگشت یک شی از کلاس یا struct

بازگشت یک Tuple

پارامترهای  Reference:

همانطور که می دانید پارامترهای "ref" یکی از رایج ترین و قدیمی ترین روش برای بازگشت چند مقدار از یک تابع است. همانطور که از نام آنها پیداست، به عنوان مرجع به تابع فرستاده می شوند و بعد از اینکه تابع اجرا شد، مقدار به روز شده ی متغیر مرجع فرستاده شده، به متد فراخوان برگردانده می شود. به این نکته مهم باید توجه داشته باشید که پارامترهای مرجع باید قبل از ارسال به تابع، تعریف و مقداردهی شوند. در اینصورت به خطای زمان اجرا برخورد خواهید کرد.

تعریف پارامترهای Reference در تابع

public int MultipleReturns(int a, int b, ref int max)  
{  
 if(a<b)  
 {  
    max=a;  
    return b;  
 }  
 else  
 {  
    max=b;  
    return a;  
 }  
}

در قطعه بالا ما یک تابع با دو پارامتر از نوع integer به نام های a و b و یک پارامتر مرجع به نام max تعریف کرده ایم. کار تابع این است که مقدار کوچک بین a و b را برمی گرداند و همچنین بزرگترین مقدار را  به پارامتر خروجی تخصیص می دهد. می توانیم تابع را به صورت زیر فراخوانی کنیم.

int a=10, b=20,max=0;  
int min = MultipleReturns(a,b,ref max);  
Console.WriteLine("Minimum Value: " + min);  
Console.WriteLine("Maximum Value: " + max);  

معایب استفاده از پارمترهای Reference

اگر شما برنامه ای برای استفاده از قابلیت async/await را داشته باشید، پارامترهای ref کار نخواهند کرد.

از نظر کدخوانی خیلی مورد مورد پسند نیستند.

پارمترهای output:

پارامترهایOutput شبیه پارامترهای مرجع می باشند. به عنوان پارامتر به تابع فرستاده می شوند و متد فراخوان منتظر برگشت بعضی مقادیر از تابع می باشد. پارامتر های خروجی در تابع زیر تعریف شده اند.

public int MultipleReturns(int a, int b, out int max)  
{  
 if(a<b)  
 {  
     max=a;  
     return b;  
 }  
 else  
 {  
     max=b;  
     return a;  
 }  
} 

در قطعه بالا ما یک تابع با دو پارامتر از نوع integer به نام های a و b و یک پارامتر خروجی به نام max تعریف کرده ایم. کار تابع این است که مقدار کوچک بین a و b را برمی گرداند و همچنین بزرگترین مقدار را  به پارامتر خروجی تخصیص می دهد. اگر تابع هیچ مقداری را به متغیر max ارسال نکند، خطای زمان اجرا رخ خواهد داد. از این رو لازم است در بدنه تابع به پارامتر خروجی، مقادیری تخصیص داده شوند. توجه داشته باشید که نمی توانیم دو تابع با نام یکسان تعریف کنیم مگر اینکه در پارامترهای ref و out تفاوت وجود داشته باشد. در غیر اینصورت با خطای زمان اجرا روبه رو خواهید شد. می توانید فراخوانی تابع را در زیر ببینید:

int a=10, b=20,max=0;  
int min = MultipleReturns(a,b,out max);  
Console.WriteLine("Minimum Value: " + min);  
Console.WriteLine("Maximum Value: " + max); 

معایب پارامترهای Out

اگر شما برنامه ای برای استفاده از قابلیت async/await را داشته باشید، پارامترهای out کار نخواهند کرد.

از نظر کدخوانی خیلی مورد مورد پسند نیستند.

آرایه های بازگشتی:

سومین روش برای بازگشت چندین مقدار از درون یک تابع، بازگشت آرایه می باشد.دوباره یک تابع به نام MultipleReturns برای بازگشت آرایه تعریف می کنیم. تعریف تابع را می توانید در زیر ببینید.

public int[] MultipleReturns(int a, int b)  
{  
      int []minMax = int[2];  
      if(a>b)  
      {  
           minMax[0] = a;  
           minMax[1] = b;  
      }  
      else  
      {  
           minMax[0] = b;  
           minMax[1] = a;  
      }  
      return minMax;  
} 

اگر دقت کرده باشید، ما آرایه را در داخل تابع تعریف کردیم و مقادیر بازگشتی بزرگترین و کوچکترین مقدار  را به ترتیب در اندیس اول و دوم آرایه قرارداده ایم. این تابع را به صورت زیر فراخوانی می کنیم.

int a=10, b=20;  
int []minMax = MultipleReturns(a,b);  
Console.WriteLine("Minimum Value: " + minMax[1]);  
Console.WriteLine("Maximum Value: " + minMax[0]); 

معایب استفاده از آرایه بازگشتی

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

تعریف ثابتی برای اینکه چه مقداری در چه اندیسی از آرایه ذخیره شده باشد نداریم. از این رو احتمال خطا بالاست.

بازگشت شی از Class یا Struct:

بازگشت چند مقدار از آرایه محدود به این می شد که ما می توانستیم از یک نوع داده، چند مقدار برگردانیم. برای مثال، اگر ما بخواهیم یک رشته را کنار یک integer برگردانیم، با این روش این امکان وجود نداشت. بازگشت شی از Class یا Struct، قویترین راه برای بازگشت چند مقدار از یک تابع می باشد. در اینجا تابع، از یک Class یا Struct، یک شی را که می تواند تعداد بیشتری از خواص آن ها را کپسوله کند، برخواهد گرداند.

در زیر ما از یک کلاس ساده برای نشان دادن بازگشت شی، استفاده کرده ایم.

struct MinMax  
{  
     public int min;  
     public int max;  
}   
public MinMax MultipleReturns(int a, int b)  
{  
       MinMax values = new MinMax();  
       values.min = a < b ? a : b;  
       values.max = a > b ? a : b;  
       return values;  
} 

این تابع را می توانیم به صورت زیر فراخوانی کنیم.

int a=10, b=20;  
MinMax results = MultipleReturns(a,b);  
Console.WriteLine("Minimum Value: " + results.min);  
Console.WriteLine("Maximum Value: " + results.max);  

بازگشت یک Tuple:

به عبارت ساده تر، Tuple به معنای ساختار داده ای متشکل از چندین بخش می باشد. Tuple در 4 #C معرفی شد. یک Tuple می تواند به عنوان یک رکورد از داده که دارای نوع داده مختلفی است، تعریف شود. بنابراین، برای مثال ما می توانیم یک Tuple شامل نام، سن و نمره دانش آموز داشته باشیم، بدون اینکه یک Class یا Struct تعریف کنیم. در زیر با یک مثال ساده بازگشت یک Tuple را به شما نشان خواهیم داد.

public Tuple<int,int> MultipleReturns(int a, int b)  
       {  
           int min, max;  
           if (a > b)  
           {  
               max = a;  
               min = b;  
           }  
           else  
           {  
               max = b;  
               min = a;  
           }  
           return new Tuple<int, int>(min, max);  
       }

در قطعه بالا، یک تابع تعریف کردیم که کوچکترین و بزرگترین مقدار را محاسبه کرده و یک tuple با نوع <int,int> به متد فراخوان برخواهد گردادند. کامپایلر می داند که ما یک Tuple از نوع integer داریم که برگردانده خواهند شد. برای فراخوانی تابع، از کدهای زیر استفاده می کنیم. 

int a=10, b=20;  
var tuple = MultipleReturns(a,b);  
Console.WriteLine("Minimum Value: " + tuple.Item1);  
Console.WriteLine("Maximum Value: " + tuple.Item2); 

پس از مطالعه همه روش های گفته شده در بالا، استفاده کامل به پروژه شما و نیازهای آن بستگی دارد. هر روش مزایا و معایب خود را دارد اما روش آنها یکسان است.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 10k بازدید
  • 10 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید