✨ تکنیکهای حرفهای پراپرتی در #C: از private set تا init
تو پست های قبلی با پراپرتیهای پایه آشنا شدیم. حالا وقتشه بریم سراغ چند تا تکنیک پیشرفتهتر و مدرن که به شما کنترل کامل روی دادههاتون میده و کدهاتون رو حرفهایتر میکنه.
1️⃣ مقداردهی اولیه پراپرتیها (Property Initializers)
در #C مدرن، شما میتونید مستقیماً به پراپرتیهای خودکار (auto-properties) مقدار اولیه بدید، دقیقاً مثل فیلدها. این کار کد رو خیلی تمیزتر و خواناتر میکنه و دیگه نیازی نیست برای مقداردهیهای ساده، حتماً سازنده (constructor) بنویسید.
public class ServerConfig
{
// مقداردهی اولیه یک پراپرتی خواندنی-نوشتنی
public string IpAddress { get; set; } = "127.0.0.1";
// مقداردهی اولیه یک پراپرتی فقط-خواندنی
public int Port { get; } = 8080;
public ServerConfig(int port)
{
// شما همچنان میتونید مقدار پراپرتی فقط-خواندنی رو در سازنده هم تغییر بدید
Port = port;
}
}
2️⃣ کنترل دسترسی با private set
گاهی وقتا میخواید یه پراپرتی از بیرون کلاس فقط-خواندنی باشه، ولی از داخل خود کلاس بتونید مقدارش رو تغییر بدید (مثلاً برای شمارندهها یا تغییر وضعیت داخلی). اینجاست که private set وارد میشه.
public class Counter
{
public int Value { get; private set; } = 0;
public void Increment()
{
// از داخل کلاس قابل تغییر است
Value++;
}
}
// --- نحوه استفاده ---
var counter = new Counter();
counter.Increment(); // Value is now 1
// counter.Value = 10; // ❌ خطای زمان کامپایل! از بیرون قابل تغییر نیست
3️⃣ انقلاب تغییرناپذیری با init (از 9 #C) 🔒
این یکی از مهمترین قابلیتهای #C مدرن برای ساخت آبجکتهای تغییرناپذیر (Immutable) هست.
پراپرتی init فقط موقع ساخت آبجکت (در سازنده یا با Object Initializer) قابل مقداردهیه و بعد از اون کاملاً قفل و فقط-خواندنی میشه.
public class Note
{
public int Pitch { get; init; } = 20;
public int Duration { get; init; } = 100;
}
// --- نحوه استفاده ---
// موقع ساخت، با Object Initializer قابل تغییره
var note = new Note { Pitch = 50 };
// بعد از ساخته شدن، دیگه نمیشه تغییرش داد
// note.Pitch = 200; // ❌ خطای زمان کامپایل!
نکته کلیدی برای کتابخانهنویسها: ⚠️
اگه شما یه پراپرتی
init جدید به کلاستون اضافه کنید، کدهای قدیمی که از کتابخونه شما استفاده میکنن، نمیشکنن\! ولی اگه یه پارامتر جدید (حتی اختیاری) به سازنده اضافه کنید، اون کدها دچار Binary Breaking Change میشن و باید دوباره کامپایل بشن. این باعث میشه init برای تکامل APIها خیلی امنتر باشه.🤔 حرف حساب و تجربه شما
این تکنیکها ابزارهای شما برای پیادهسازی اصل کپسولهسازی و ساختن کلاسهای امن، تغییرناپذیر و قابل نگهداری هستن.
🔖 هشتگها:
#CSharp #DotNet #OOP #Properties #CleanCode #Immutability