یکی از امکانات جالب و جدید معرفی شده در Csharp
2010، پارامتر های اختیاری برای توابع می باشند. بدین ترتیب که اکنون می
توانیم هنگام تعریف پارامترهای یک تابع، مقدار پیشفرضی برای آن تعیین نماییم و در
صورتی که برنامه نویس هنگام فراخوانی تابع، مقداری را برای آن ارسال ننماید، مقدار
پیشفرض پارامتر منظور می شود.
برای درک بهتر مسئله به مثال زیر توجه نمایید.
Overload نمودن توابع در زبان
#C معمولا به شکل زیر انجام می شود. فرض کنید قصد داریم
سه عدد Overload برای یک تابع بنویسیم که وظیفه آن ایجاد
یک کاربر جدید می باشد.
public void CreateUser(string username, string password)
{
CreateUser(username, password, false);
}
public void CreateUser(string username, string password, bool isAdmin)
{
CreateUser(username, password, false, string.Empty, string.Empty);
}
public void CreateUser(string username, string password, bool isAdmin, string firstName, string lastName)
{
//عملیات ایجاد کاربر جدید با استفاده از پارامتر های ارسال شده
// انجام می شود
}
همنانطور که در قطعه کد بالا ملاحظه می نمایید، ما امکانات زیر را
برای برنامه نویس فراهم نموده ایم.
-
برای ثبت نام کاربر فقط نام کاربری و رمز عبور را ارسال نماید.
-
برای ثبت نام، پارامترهای نام کاربری، رمز عبور و یک مقدار منطقی
(isAdmin) که نشان دهنده مدیر بودن کاربر است را
ارسال نماید.
-
برای ثبت نام، تمام پارامتر های موجود که شامل نام کاربری، رمز
عبور، isAdmin، نام و نام خانوادگی
است را وارد نماید.
نحوه فراخوانی این توابع می تواند به هر سه شکل زیر باشد.
private void Form1_Load(object sender, EventArgs e)
{
CreateUser("MyUserName", "MyPassword");
CreateUser("MyUserName", "MyPassword", false);
CreateUser("MyUserName", "MyPassword", false, "MyFirstName", "MyLastName");
}
در حقیقت وظیفه اصلی دو تابع اول از توابع بالا را می توان مقدار
اولیه دادن به پارامتر های متد آخر بیان نمود. با استفاده از متدهای بالا ما این
امکان را فراهم نموده ایم که برنامه نویس برخی از پارامتر ها را به صورت اختیاری به
تابع ایجاد کاربر جدید، ارسال نماید.
با استفاده از ویژگی پارامتر های اختیاری در
Csharp 2010 می توانیم سه تابع در تعریف شده در بالا را با استفاده از فقط
یک تابع بنویسیم.
در تابع زیر این عمل را ملاحظه می نمایید.
public void CreateUser(string username, string password,
bool isAdmin = false, string firstName = "", string lastName = "")
{
//عملیات ایجاد کاربر جدید با استفاده از پارامتر های ارسال شده
//انجام می شود
}
اگر با دقت به تابع بالا دقت نمایید، ملاحظه می کنید که هنگام تعریف
پارامتر هایی که قصد داریم به شکل اختیاری تعریف شوند (در اینجا پارامتر های
isAdmin و firstName و
lastName مورد نظر می باشند)، مقدار پیشفرضی به آن ها
نسبت داده ایم. در نتیجه اگر هنگام فراخوانی این تابع، مقداری برای پارامتر های
اختیاری ارسال نشود، مقدار پیشفرض برای آن ها در نظر گرفته می شود.
به شکل زیر توجه نمایید. پارامتر های اختیاری در داخل
Tooltip ی که برنامه VS 2010
نشان داده است در داخل علامت براکت "[]" نمایش داده شده
اند و بدین وسیله برنامه نویس متوجه خواهد شد که ارسال این پارامتر ها اختیاری می
باشد.
در قطعه کد زیز نیز می توانید فراخوانی های مختلف این تابع را ببینید
که کاملا شبیه زمانی است که سه تابع مختلف را برای Overload، نوشته بودیم.
private void Form1_Load(object sender, EventArgs e)
{
CreateUser("MyUserName", "MyPassword");
CreateUser("MyUserName", "MyPassword", false);
CreateUser("MyUserName", "MyPassword", false, "MyFirstName", "MyLastName");
}
پارامتر های اختیاری یک ویژگی بسیار جالب دیگر را نیز ارائه نموده
اند. فرض کنید برنامه نویس نیاز پیدا می کند که برای ایجاد کاربر فقط نام کاربری و
رمز عبور و نام شخص را جهت ایجاد کاربر ارسال نماید و به عبارت دیگر قصد ندارد
که پارامتر های isAdmin و lastName
را ارسال نماید.
برای انجام اینکار تا قبل از معرفی امکان جدید پارامتر های اختیاری،
شما باید یک تابع دیگر نیز به شکل Overload اضافه می
نمودید که این امکان را برای برنامه نویس فراهم می نمودید و
در نتیجه هر چقدر که درخواست های
برنامه نویس بیشتر می شد معمولا باعث نوشتن متدهای Overload
بیشتری می شد.
اما پارامتر های اختیاری این مشکل را نیز رفع نموده اند. در صورتی که
قصد داشته باشیم فقط برای برخی از پارامتر های اختیازی در اینگونه توابع مقداری
ارسال نماییم، کافی است که نام پارامتر را نیز همراه با مقدار مورد نظرمان در هگام
فراخوانی تابع ارسال نماییم.
این عمل به شکل زیر امکان پذیر می باشد.
private void Form1_Load(object sender, EventArgs e)
{
CreateUser("MyUserName", "MyPassword", firstName: "MyFirstName");
}
به نحوه ارسال پارامتر
firstName توجه فرمایید.