آموزش توابع در سی شارپ، انواع و نکات کاربردی

یک تابع که به شما اجازه می دهد که یک قسمت از کد را به صورت یک بسته درآورده و آن را از بخش های دیگر کد خودتان فراخوانی کنید. شما ممکن است در شرایطی قرار بگیرید که بخواهید یک بخش از کد را از چندین موقعیت تکرار کنید؛ و در این بخش ها است که توابع وارد می شوند.
استفاده از تابع باعث میشود برنامه:
- منظمتر شود.
- کدهای تکراری کمتر شوند.
- خطایابی سادهتر شود.
- بخشهای مختلف برنامه راحتتر مدیریت شوند.
ساختار ساده یک تابع
static void SayHello()
{
Console.WriteLine("سلام");
}در این مثال:
SayHelloنام تابع است.voidیعنی تابع چیزی برنمیگرداند.- دستورات داخل
{ }بدنه تابع هستند.
برای اجرای تابع مینویسیم:
SayHello();خروجی:
سلامتابع دارای ورودی
میتوان اطلاعاتی را به تابع ارسال کرد.
static void SayHello(string name)
{
Console.WriteLine("سلام " + name);
}استفاده:
SayHello("علی");خروجی:
سلام علیدر اینجا name یک پارامتر (Parameter / پارامتر ورودی) است.
تابع با چند پارامتر
یک تابع میتواند چند ورودی داشته باشد.
static void ShowInfo(string name, int age)
{
Console.WriteLine(name);
Console.WriteLine(age);
}فراخوانی:
ShowInfo("رضا", 25);تابعی که مقدار برمیگرداند
بعضی توابع نتیجه محاسبه را به قسمت دیگری از برنامه برمیگردانند.
مثلاً:
static int Sum(int a, int b)
{
return a + b;
}استفاده:
int result = Sum(10, 20);
Console.WriteLine(result);خروجی:
30در اینجا:
intیعنی تابع یک عدد صحیح برمیگرداند.returnبرای برگرداندن نتیجه استفاده میشود.
تفاوت void و return
اگر تابع فقط کاری انجام دهد و نیازی به برگرداندن نتیجه نباشد:
static void ShowMessage()
{
Console.WriteLine("خوش آمدید");
}از void استفاده میکنیم.
اما اگر تابع باید نتیجه تولید کند:
static int Multiply(int a, int b) { return a * b; }
نوع نتیجه باید مشخص شود.
مثال محاسبه مساحت مستطیل
static double RectangleArea(double length, double width)
{
return length * width;
}استفاده:
double area = RectangleArea(10, 5);
Console.WriteLine(area);خروجی:
50فراخوانی تابع چیست؟
نوشتن تابع بهتنهایی باعث اجرای آن نمیشود.
مثلاً ابتدا تابع را تعریف میکنیم:
static void Welcome()
{
Console.WriteLine("خوش آمدید");
}سپس آن را فراخوانی (Call / اجرا) میکنیم:
Welcome();متغیر محلی در تابع
متغیری که داخل تابع تعریف شود معمولاً فقط در همان تابع قابل استفاده است.
static void Test() { int number = 10; Console.WriteLine(number); }
متغیر number یک متغیر محلی است.
خارج از تابع Test نمیتوان مستقیماً از آن استفاده کرد.
پارامتر اختیاری
در سیشارپ میتوان برای بعضی پارامترها مقدار پیشفرض تعیین کرد.
static void Welcome(string name = "کاربر")
{
Console.WriteLine("سلام " + name);
}اگر بنویسیم:
Welcome();خروجی:
سلام کاربراما اگر بنویسیم:
Welcome("محمد");خروجی:
سلام محمدتابع با نوع bool
گاهی تابع فقط مشخص میکند یک شرط درست است یا خیر.
static bool IsAdult(int age)
{
return age >= 18;
}استفاده:
bool result = IsAdult(20);
Console.WriteLine(result);خروجی:
Trueبازنویسی تابع
در سیشارپ میتوان چند تابع با یک نام ولی ورودیهای متفاوت داشت. به این قابلیت Overloading یا سربارگذاری متد گفته میشود.
staticint Sum(int a, int b) { return a + b; } static int Sum(int a, int b, int c) { return a + b + c; }
اکنون هر دو حالت قابل استفادهاند:
Sum(10, 20);
Sum(10, 20, 30);چرا از تابع استفاده میکنیم؟
فرض کنید لازم است چند بار مالیات یک مبلغ را محاسبه کنیم.
بهجای نوشتن فرمول در چند جای برنامه، یک تابع میسازیم:
static double CalculateTax(double price)
{
return price * 0.1;
}سپس هر جا لازم باشد:
double tax1 = CalculateTax(1000);
double tax2 = CalculateTax(2500);به این ترتیب اگر فرمول تغییر کند، فقط همان تابع را اصلاح میکنیم.
یک مثال کامل
static int Sum(int a, int b)
{
return a + b;
}
int result = Sum(15, 25);
Console.WriteLine("نتیجه:");
Console.WriteLine(result);خروجی:
نتیجه:
40نکات مهم برای نامگذاری توابع
نام تابع بهتر است مشخص کند چه کاری انجام میدهد.
نامهای مناسب:
CalculatePrice
ShowMessage
GetUserName
CheckPassword
CalculateAreaنامهای ضعیف:
x
test1
abc
method2نام واضح باعث خواناتر شدن برنامه میشود.
خلاصه
ساختار کلی یک تابع در سیشارپ:
نوع_خروجی نام_تابع(پارامترها)
{
دستورات
return نتیجه;
}مثلاً:
static int Multiply(int a, int b)
{
return a * b;
}مهمترین مفاهیمی که باید درباره توابع یاد بگیرید عبارتاند از:
تعریف تابع → فراخوانی تابع → پارامتر → مقدار بازگشتی → return → void → متغیر محلی → سربارگذاری
در برنامههای واقعی، توابع یکی از مهمترین ابزارها برای تقسیم یک برنامه بزرگ به بخشهای کوچک و قابل مدیریت هستند.
توضیح به زبان ساده تر
در سی شارپ، توابع را اساساً به صورت زیر بیان می کنند.
( )
{
}
برای فراخوانی یک تابع؛ شما به سادگی نام آن را نوشته، یک پرانتز باز گذاشته و سپس اگر پارامتری وجود داشته باشد؛ آنها را نوشته و سپس پارانتز را ببندید؛ که به صورت زیر نوشته می شود:
DoStuff();
در این قسمت مثالی از تابع ()DoStuff را مشاهده می کنید:
public void DoStuff()
{
Console.WriteLine(“I’m doing something…”);
}
بخش اول، یعنی public، آشکار می باشد و اختیاری است. اگر چیزی را تعریف نکنید؛ سپس تابع خصوصی خواهد بود. در مورد این موضوع در فصل های بعدی بیشتر بحث می کنیم. سپس نوع داده ای که در نتیجه حاصل می شود، باید مطرح شود. این نوع داده می تواند هر نوع داده ی مجاز در سی شارپ باشد؛ و همان طور که می بینید ما در این قسمت از void استفاده کرده ایم. یک void به این معنا است که این تابع قطعاً هیچ نتیجه ای را به دست نخواهد داد. همچنین، این تابع پارامتری را نیز اتخاذ نمی کند؛ زیرا مشاهده می کنید که پرانتزهای مقابل تابع خالی هستند، در واقع کدی که نوشته شده است تا حدودی خسته کننده می باشد. پس بیایید آن را تغییر دهیم.
public int AddNumbers(int number1, int number2)
{
int result = number1 + number2;
return result;
}
همان طور که مشاهده می کنید؛ ما تقریباً همه چیز را تغییر داده ایم. این تابع اکنون یک عدد صحیح را برمی گرداند، دو پارامتر (هر دو عدد صحیح) را می گیرد و به جای ایجاد چیزی در خروجی، یک محاسبه را انجام می دهد و سپس نتیجه را برمی گرداند. این بدان معنی است که به جای این که بخواهیم هر بار کد محاسبه را بنویسیم، می توانیم به راحتی با فراخوانی این تابع، دو عدد را از مکانهای مختلف در کد خود اضافه کنیم. در حالی که این مثال کوچک، وقت و تلاش زیادی را برای ما، ذخیره سازی نمی کند؛ بهتر است باور داشته باشید که هر چقدر بیشتر توابع را بیاموزید می توانید بیشتر از سی شارپ استفاده کنید. این تابع به صورت زیر بیان می شود:
int result = AddNumbers(10, 5);
Console.WriteLine(result);
همانطور که گفته شد ، این تابع در واقع چیزی را بر می گرداند و باید این کار را انجام دهد زیرا ما به C شارپ گفتیم که قرار است این کار را انجام دهد. زمانی که هر چیزی به جز void به عنوان داده بازگشتی بیان شود؛ ما برنامه خود را در واقع ملزم می کنیم تا حتماً چیزی را بازگرداند. شما می توانید خطی که نتیجه را باز می گرداند از مثال بالا حذف کنید و حاصل کامپایلر را مشاهده کنید:
‘AddNumbers(int, int)’: not all code paths return a value
کامپایلر به ما یادآوری می کند که ما تابعی داریم که چیزی را بر نمی گرداند. البته جای حذف کردن آن خط، می توانید چیزی شبیه به این کدها را امتحان کنید:
public int AddNumbers(int number1, int number2)
{
int result = number1 + number2;
if(result > 10)
{
return result;
}
}
شما همان خطا را مشاهده خواهید کرد؛ اما چرا؟ زیرا هیچ ضمانتی وجود ندارد که عبارت if ما درست ارزیابی کند و خطی که باید نتیجه را ایجاد نماید؛ شروع به اجرا کند. شما می توانید با لحاظ کردن یک عبارت دوم بازگردانی نتیجه در انتها، این مشکل را برطرف کنید.
public int AddNumbers(int number1, int number2)
{
int result = number1 + number2;
if(result > 10)
{
return result;
}
return 0;
}
به این ترتیب مشکلی که برای خودمان ایجاد کرده ایم؛ برطرف می شود؛ و به این ترتیب به شما نشان دادیم که می توانید بیشتر از یک عبارت برای حاصل کردن نتیجه داشته باشید. به محض این که به یک عبارت بازگرداندن نتیجه برسیم؛ عملکرد باقی مانده و دیگر کدی که در آن وجود دارد؛ اجرا نمی شود. در این مورد؛ تا زمانی که نتیجه بزرگتر از ۱۰ باشد؛ نتیجه ی “۰” هرگز به دست نمی آید.
