شیرجه عمیق در ref locals و ref returns
آمادهاید که به بخشهای عمیق و کمتر دیدهشده #C سفر کنیم؟ امروز میخوایم در مورد دو تا قابلیت قدرتمند ولی خاص صحبت کنیم که برای بهینهسازیهای سطح پایین و کارهای حرفهای استفاده میشن: ref locals و ref returns.
اینها ابزارهای روزمره شما نیستن، ولی شناختنشون شما رو به درک عمیقتری از قدرت و انعطاف #C میرسونه.
1️⃣این ref local چیست؟ یک نام مستعار برای حافظه
یه ref local، یه متغیر محلیه که یک کپی از مقدار نیست، بلکه یک ارجاع یا نام مستعار مستقیم به حافظهی یک متغیر دیگهست (مثل یک عنصر آرایه یا یک فیلد).
این یعنی هر تغییری روی این متغیر، مستقیماً روی مقدار اصلی اعمال میشه!
int[] numbers = { 0, 1, 2, 3, 4 };
// numRef حالا یک نام دیگر برای numbers[2] است
ref int numRef = ref numbers[2];
// هر تغییری روی numRef، مستقیماً روی عنصر آرایه اعمال میشه
numRef *= 10;
Console.WriteLine(numRef); // خروجی: 20
Console.WriteLine(numbers[2]); // خروجی: 20 (عنصر اصلی هم تغییر کرد!)2️⃣حالا ref return چیست؟ برگرداندن آدرس به جای مقدار 💥
یه متد میتونه به جای برگردوندن مقدار یک متغیر، رفرنس یا آدرس حافظهی اون رو برگردونه. این کار به کدی که متد رو صدا زده، اجازه دسترسی مستقیم و تغییر مقدار اصلی رو میده.
class Program
{
static string x = "Old Value";
// این متد، رفرنس به فیلد x رو برمیگردونه
static ref string GetX() => ref x;
static void Main()
{
// xRef یک رفرنس مستقیم به x میشه
ref string xRef = ref GetX();
// تغییر xRef، خودِ متغیر استاتیک x رو تغییر میده
xRef = "New Value";
Console.WriteLine(x); // خروجی: New Value
}
}
3️⃣نوبت ref readonly: ترکیب پرفورمنس و ایمنی 🛡
گاهی وقتا شما میخواید از مزیت پرفورمنس برگردوندن رفرنس (جلوگیری از کپی شدن دادههای بزرگ) استفاده کنید، ولی نمیخواید کدی که اون رو دریافت کرده، بتونه مقدار اصلی رو تغییر بده.
اینجاست که ref readonly وارد میشه. با این قابلیت، شما رفرنس رو برمیگردونید، ولی اون رفرنس فقط-خواندنی خواهد بود.
4️⃣هشدار و کاربرد اصلی ⚠️
این قابلیتها ابزارهای روزمره شما نیستن. اونها برای micro optimization های خاص طراحی شدن، به خصوص در سناریوهای پرفورمنس بالا مثل کار با <Span<T یا در بازیسازی که هر نانوثانیه مهمه.
در ۹۹٪ مواقع، شما به اینها نیاز ندارید و کد سادهتر، همیشه بهتره.
🤔 حرف حساب و تجربه شما
آشنایی با این مفاهیم، حتی اگه ازشون استفاده نکنید، دید شما رو نسبت به قابلیتهای سطح پایین و قدرت #C عمیقتر میکنه.
آیا تا حالا از ref locals یا ref returns تو پروژهای استفاده کردید؟ یا اصلاً از وجودشون خبر داشتید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[C# Geeks Hangout]
🔖 هشتگها:
#Ref
#CSharp
#AdvancedCSharp