اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
در زبان برنامه نویسی #C، هر متد، توانایی برگرداندن یک مقدار را دارد و در مواقعی نیاز داریم بیشتر از یک مقدار را از یک متد به عنوان خروجی دریافت کنیم که استفاده از پارامترهای out و ref و یا Tuple راه حلهایی برای رسیدن به این مقصود میباشند.
یکی از تازههای 7 #C، ساده شدن تعریف out parameterها نسبت به قبل میباشد که باعث مرتب شدن کدها نیز میشود که در ادامه به آن میپردازیم.
تا قبل از ارائه 7 #C، برای ارسال یک پارامتر به صورت out میبایستی قبل از استفاده و ارسال آن به متد مورد نظر، ابتدا متغیر مربوطه را تعریف میکردیم که نمونهای از تعریف مذکور، قطعه کدهایی شبیه به زیر است:
خروجی متد TryParse به صورت boolean میباشد و در صورتیکه نتواند مقدار input را به int تبدیل کند، مقدار false برگردانده میشود؛ در غیر اینصورت مقدار true برگردانده خواهد شد و مقدار input در numericResult قرار میگیرد. همانطور که مشاهده میکنید برای اینکه بتوان مقدار تبدیل شده را داشته باشیم، ابتدا اقدام به تعریف یک متغیر کرده و بعد با استفاده از پارامتر out، آن را ارسال کردهایم.
قطعه کد فوق در 7 #C به صورت زیر در خواهد آمد:
در 7 #C امکان ترکیب تعریف پارمتر، به صورت inline در محل ارسال آرگومان وجود دارد و دیگر نیازی به تعریف متغیر، قبل از ارسال آن به تابع نیست.
در مثال فوق نوع متغیر را به صورت صریح مشخص کردهایم؛ همچنین امکان تعریف متغیر به صورت ضمنی را هم داریم:
اولین سوالی که ممکن است با دیدن نمونه کد فوق پیش بیاید، محدودهی متغیرهای out که به صورت inline تعریف میشوند، میباشد و احتمالا تصور کردهاید که محدوده دید آنها محدود به بلاک if میباشد؛ اما در عمل دامنهی دید متغیر result برابر است با بلاک بیرونی شرط، که میتوان از متغیر مورد نظر بعد از دستور if نیز استفاده نمود. قطعه کد زیر بیان کنندهی این موضوع میباشد:
out variables را میتوان یکی از سادهترین تازههای 7 #C دانست که باعث خواناتر شدن کدها میشود. در واقع دقیقا در جائیکه نیاز به متغیر است، تعریف میشود و اطمینان داریم که متغییر مربوطه قبل از ارسال به تابع، به صورت ناخواسته یا تصادفی مقداری اشتباه به آن انتساب داده نشده است.
قبل از 7#C:
و کد فوق در 7 #C :
یکی از تازههای 7 #C، ساده شدن تعریف out parameterها نسبت به قبل میباشد که باعث مرتب شدن کدها نیز میشود که در ادامه به آن میپردازیم.
تا قبل از ارائه 7 #C، برای ارسال یک پارامتر به صورت out میبایستی قبل از استفاده و ارسال آن به متد مورد نظر، ابتدا متغیر مربوطه را تعریف میکردیم که نمونهای از تعریف مذکور، قطعه کدهایی شبیه به زیر است:
int numericResult; if (int.TryParse(input, out numericResult)) WriteLine(numericResult); else WriteLine("Could not parse input");
قطعه کد فوق در 7 #C به صورت زیر در خواهد آمد:
if (int.TryParse(input, out int result)) WriteLine(result); else WriteLine("Could not parse input");
در مثال فوق نوع متغیر را به صورت صریح مشخص کردهایم؛ همچنین امکان تعریف متغیر به صورت ضمنی را هم داریم:
if (int.TryParse(input, out var answer)) WriteLine(answer); else WriteLine("Could not parse input");
اولین سوالی که ممکن است با دیدن نمونه کد فوق پیش بیاید، محدودهی متغیرهای out که به صورت inline تعریف میشوند، میباشد و احتمالا تصور کردهاید که محدوده دید آنها محدود به بلاک if میباشد؛ اما در عمل دامنهی دید متغیر result برابر است با بلاک بیرونی شرط، که میتوان از متغیر مورد نظر بعد از دستور if نیز استفاده نمود. قطعه کد زیر بیان کنندهی این موضوع میباشد:
if (!int.TryParse(input, out int result)) { return null; } return result;
out variables را میتوان یکی از سادهترین تازههای 7 #C دانست که باعث خواناتر شدن کدها میشود. در واقع دقیقا در جائیکه نیاز به متغیر است، تعریف میشود و اطمینان داریم که متغییر مربوطه قبل از ارسال به تابع، به صورت ناخواسته یا تصادفی مقداری اشتباه به آن انتساب داده نشده است.
قبل از 7#C:
class Program { static void Main(string[] args) { string firstName; string lastName; CreateName(out firstName, out lastName); Console.WriteLine($"Hello {firstName} {lastName}"); } private static void CreateName(out string firstName, out string lastName) { firstName = "Kevin"; lastName = "Griffin"; } }
و کد فوق در 7 #C :
class Program { static void Main(string[] args) { CreateName(out string firstName, out string lastName); Console.WriteLine($"Hello {firstName} {lastName}"); } private static void CreateName(out string firstName, out string lastName) { firstName = "Kevin"; lastName = "Griffin"; } }