شاید برای شما هم پیش آمده باشد که هنگام برسی کد های دیگران یا کد هایی که در آموزش ها برسی میشوند ref و out را زیاد شنیده باشید.در مطلب امروز به برسی کامل ref , out در زبان سی شارپ میپردازیم.
فرض کنید یک متغیر با نام num داریم و میخواهیم num را مقداردهی کنیم ، روش های مختلفی برای مقدار دهی وجود دارد.
برای شروع بیاید با کد زیر پیش برویم???
روش اول برای مقدار دهی یک متغیر (برای مثال string)
string num = "ali";
روش بعدی میتونه این شکلی باشه
string num;
num = "ali";
روش بعدی مقدار دهی متغیر با استفاده از یک متد میباشد.
public static string Test()
{
return "ali";
}
خروجی متد ما از جنس رشته(string) میباشد، به این معنا که میتوان num را با متدی که بالا نوشتیم به شکل زیر مقدار دهی کنیم.
string num = Test();
مقدار دهی یک متغیر در زبان سی شارپ به روش های مختلفی انجام میشود اما شاید مقدار بازگشتی متد ما با نوع متغیر یکی نباشد، شاید متد ما مقدار بازگشتی true یا false را برمیگرداند.
مثلا کد زیر را در نظر بگیرید
static void Main()
{
string name;
Test();
}
public static void Test()
{
}
زمانی که بخواهیم از طریق ورودی یک متد مقدار یک متغیر را تغییر دهیم میتوانیم از ref , out استفاده کنیم
نوشتن یک کد مثال با ref
static void Main()
{
string name = "arman"; value is Ali
Test(ref name);
}
public static void Test(ref string name)
{
name = "ali";
}
مقدارname برابر با ali میشود چرا که ما ورودی متد Test را طوری تعریف کردیم که مستقیم مقدار name را تغیر دهد، به عبارتی ما یک ارتباط مستقیم بین ورودی متد و مقدار متغیر ایجاد کردیم.
برای درک بهتر این کد را کپی و اجرا کنید
public class Program
{
static void Main()
{
string name = "arman";
Test(ref name);
}
public static void Test(ref string name)
{
name = "ali";
}
}
پارامتر های ref و out هر دو مثل یک دیگر عمل میکنند اما یک تفاوت بزرگ بین آنها وجود دارد
به کد زیر کمی نگاه کنید و آن را برای خود اجرا کنید.
public class Program
{
static void Main()
{
string name = "arman";
Test(out name);
}
public static void Test(out string name)
{
name = "ali";
}
}
خروجی کد بالا با خروجی کد قبلی یکسان خواهد بود ، پس چه تفاوتی بین این دو پارامتر وجود دارد؟
زمانی که با out پارمتری را به متد پاس میدهیم باید آن را یک بار داخل متد هم مقدار دهی کنیم
در غیر این صورت با خطا مواجه میشویم.
درست مثل تصویر پایین?
در چه صورتی خطا درست میشود؟
زمانی که name را داخل متد مقداردهی کردیم خطا رفع شد.
در واقع زمانی از out استفاده میکنیم که میخواهیم مطمئن شویم مقدار ورودی را مجدد مقدار دهی میکنیم.
البته در برخی کد های دیگر هم کاربرد دارد که جای ذکر آن در این مطلب نیست.
در اینجا تمام تلاش خودم رو کردم تا بهتون کاربرد ref و out را توضیح بدم امیدوارم لذت برده باشید!