آموزش پارامترهای توابع در سی شارپ
در فصل قبل ، ما نگاهی به توابع انداختیم و به طور خلاصه در مورد پارامترها بحث کردیم، اما فقط به طور خلاصه به آنها پرداختیم. در حالی که پارامترهای بسیار ساده و مستقیمی برای استفاده وجود دارند، ترفندهایی وجود دارد که می تواند آنها را بسیار قدرتمندتر کند.
اولین چیزی که ما به آن می پردازیم، مدیفایرهای ref و out است. سی شارپ و سایر زبانها نیز بین دو نوع پارامتر تمایز قائل می شوند: پارامترهای “براساس مقدار” و پارامترهای “بر اساس مرجع”. پیش فرض در سی شارپ “بر اساس مقدار” است ، که در اصل به این معنی است که وقتی یک متغیر را به یک فراخوانی تابع منتقل می کنید، در واقع به جای رجوع به آن ، یک کپی از شیء را ارسال می کنید. این همچنین بدان معنی است که شما می توانید بدون اینکه روی شی اصلی که به عنوان پارامتر منتقل کرده اید، تأثیر بگذارید، از درون تابع، پارامتر را تغییر می دهید.
با واژه های کلیدی out و ref می توانیم این رفتار را تغییر دهیم، بنابراین ما به جای مقدار آن، یک مرجع به شیء منتقل می کنیم.
ref modifier در سی شارپ
مثال زیر را در نظر بگیرید:
static void Main(string[] args)
{
int number = 20;
AddFive(number);
Console.WriteLine(number);
Console.ReadKey();
}static void AddFive(int number)
{
number = number + 5;
}
ما یک عد صحیح تعریف کرده ایم که مقدار ۲۰ را به آن اختصاص داده ایم، و سپس ما از متد AddFive() استفاده می کنیم، که باید مقدار ۵ را به عدد ما اضافه کند. اما آیا این کار را انجام می دهد؟ خیر. مقداری که از داخل تابع، به عدد اختصاص می دهیم، هرگز از خارج از تابع تغییر نمی کند، زیرا ما به جای یک رفرنس به عدد؛ یک نسخه از مقدار عدد را منتقل کرده ایم. می توان گفت که سی شارپ بر اساس این اصل، به سادگی کار می کند، و در بسیاری موارد ، نتیجه مطلوب است. با این حال، در مورد این مثال، ما در واقع مایل به تغییر عدد درون تابع خود هستیم. کلمه کلیدی ref را وارد کنید:
static void Main(string[] args)
{
int number = 20;
AddFive(ref number);
Console.WriteLine(number);
Console.ReadKey();
}static void AddFive(ref int number)
{
number = number + 5;
}
همان طور که مشاهده می کنید؛ همه آنچه که انجام داده ایم، اضافه کردن کلیدواژه ref به بیان تابع و نیز فراخوانی تابع است. اگر برنامه را اکنون اجرا کنید؛ پس از بازگرداندن فراخوانی تابع؛ خواهید دید که مقدار تابع اکنون تغییر می کند.
out modifier
مدیفایر out نیز تقریباً مانند ref کار می کند. هر دو اطمینان حاصل می کنند که پارامتر به جای مقدار ، توسط مرجع منتقل می شود ، اما آنها، دو تفاوت مهم به همراه دارند: مقداری که به یک مدیفایر ref منتقل می شود باید قبل از فراخوانی متد، مقدار دهی بشود – این امر برای مدیفایر out صحیح نیست، چرا که در این مورد شما می توانید از مقادیری استفاده کنید که مقدار دهی اولیه نشده باشد. از طرف دیگر ، شما نمی توانید یک فراخوانی تابع را با یک پارامتر out، بدون اینکه یک مقداری را به آن اختصاص داده باشید، رها کنید. از آنجا که می توانید مقادیری را که مقدار اولیه نگرفته اند را به عنوان یک پارامتر out منتقل کنید، نمی توانید در واقع از یک پارامتر out در داخل یک تابع استفاده کنید – فقط می توانید یک مقدار جدید به آن اختصاص دهید.
برنامه نویسی سی شارپ رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن، توسعه وب ... دانلود:
استفاده از ref یا out بستگی به موقعیت دارد، زیرا پس از شروع استفاده از آنها متوجه خواهید شد. هر دو به طور معمول برای کار روی مسئله ای استفاده می شوند که بتوان با به کار گیری سی شارپ؛ یک مقدار را از تابع برگرداند.
همان طور که در بالا نشان دادیم؛ استفاده از مدیفایر out مشابه استفاده از مدیفایر ref می باشد. فقط به سادگی کلیدواژه ref را به out تغییر می دهید. در مثال بالا، به یاد داشته باشید که باید مقدار تخصیص داده شده به عددی که در متد آمده است، حذف نمایید و در عوض تابع فراخوانی را بیان کنید.
مدیفایر params
تا کنون؛ همه ی توابع ما مقدار ثابتی از پارامترها را پذیرفته اند. با این حال، در برخی موارد؛ شما ممکن است نیاز به تابعی داشته باشید که تعداد پارامترهایی که اتخاذ می کنند؛ اختیاری باشد. این امر نیز مشابه زیر، با پذیرش یک آرایه یا یک لیست به عنوان یک پارامتر قابل انجام است:
static void GreetPersons(string[] names) { }
با این حال، فراخوانی آن؛ کمی بد سلیقگی است. در شکلی که کوتاه ترین حالت خود را دارد؛ فراخوانی به شکل زیر در می آید:
GreetPersons(new string[] { “John”, “Jane”, “Tarzan” });
این قابل قبول است؛ اما می توان با کلیدواژه های params هوشمندانه تر نیز انجام شود:
static void GreetPersons(params string[] names) { }
فراخوانی آن مشابه زیر خواهد بود:
GreetPersons(“John”, “Jane”, “Tarzan”);
مزایت دیگر استفاده از رویکرد params آن است که شما می توانید پارامترهای صفر را نیز به آن منتقل کنید. توابع با پارامترهای params می توانند حتی پارامترهای دیگری را نیز اتخاذ کنند، در بررسی مت پارامترهایی با کلیدواژه params آخرین نوع پارامترها هستند. علاوه بر آن؛ تنها یک پارامتر با استفاده از کلیدواژه params را می توان در هر تابع استفاده کرد. در اینجا مثال آخر و کاملتر آورده شده است:
static void Main(string[] args)
{
GreetPersons(0);
GreetPersons(25, “John”, “Jane”, “Tarzan”);
Console.ReadKey();
}static void GreetPersons(int someUnusedParameter, params string[] names)
{
foreach(string name in names)
Console.WriteLine(“Hello, ” + name);
}