بازگرداندن چند مقدار از متد با out
تا حالا شده بخوای یه متد بنویسی که بیشتر از یه مقدار رو برگردونه؟ مثلاً هم نتیجه عملیات و هم یه پیام وضعیت؟ تو #C برای این کار یه ابزار فوقالعاده داریم:
کلمه کلیدی out.
این کلمه کلیدی به شما اجازه میده پارامترهایی تعریف کنید که مقدارشون از داخل متد به بیرون منتقل میشه.
این out چیست و چه فرقی با ref داره؟
کلمه کلیدی out هم مثل ref، پارامتر رو بر اساس رفرنس پاس میده (یعنی آدرس حافظه رو میفرسته). اما دو تا قانون مهم و متفاوت داره:
1️⃣نیازی نیست قبل از متد مقداردهی بشه: شما میتونید یه متغیر تعریف نشده رو به یه پارامتر out پاس بدید.
2️⃣حتماً باید داخل متد مقداردهی بشه: متد موظفه که قبل از تموم شدن، یه مقداری رو تو اون پارامتر بریزه. این قانون توسط کامپایلر چک میشه.
کاربرد اصلی: بازگرداندن چند مقدار
بهترین کاربرد out، زمانیه که میخواید از یک متد، چند مقدار خروجی بگیرید.
مثال: فرض کنید میخوایم یه متد بنویسیم که اسم کامل رو بگیره و اسم کوچک و فامیل رو جدا کنه.
void Split(string fullName, out string firstName, out string lastName)
{
int i = fullName.LastIndexOf(' ');
// متد موظفه هر دو پارامتر out رو مقداردهی کنه
firstName = fullName.Substring(0, i);
lastName = fullName.Substring(i + 1);
}
// --- نحوه استفاده ---
string fName, lName; // لازم نیست مقدار اولیه داشته باشن
Split("Stevie Ray Vaughan", out fName, out lName);
Console.WriteLine(fName); // خروجی: Stevie Ray
Console.WriteLine(lName); // خروجی: Vaughn
ترفندهای مدرن: out variables و Discards (_) ✨
برای راحتتر شدن کار، #C دو تا قابلیت باحال برای out اضافه کرده:
1️⃣تعریف متغیر در لحظه (Out Variables):
لازم نیست متغیر رو از قبل تعریف کنید! میتونید همونجا موقع صدا زدن متد، تعریفش کنید:
Split("Stevie Ray Vaughan", out string firstName, out string lastName);
Console.WriteLine(lastName); // Vaughan2️⃣نادیده گرفتن خروجی (Discards):
اگه به یکی از خروجیها نیاز ندارید، میتونید با یه آندرلاین (_) اون رو نادیده بگیرید تا کدتون تمیزتر بشه:
// ما اینجا فقط به اسم کوچک نیاز داریم
Split("Stevie Ray Vaughan", out string fName, out _);
Console.WriteLine(fName); // Stevie Ray
🤔 حرف حساب و تجربه شما
این out یکی از پرکاربردترین کلمات کلیدی در کتابخانههای داتنته (مثلاً متد معروف int.TryParse). بلد بودنش خیلی به کارتون میاد.
شما بیشتر کجا از out استفاده کردید؟ آیا از قابلیت تعریف متغیر همزمان یا Discard خبر داشتید؟
نظراتتون رو کامنت کنید! 👇
[C# Geeks Hangout]
🔖 هشتگها:
#CSharp
#DotNet
#OutKeyword