اشیاء تغییر ناپذیر (Immutable Object)

گاهی در برنامه های خود نیاز به ایجاد اشیایی داریم که وضعیت داخلی این اشیاء (مقادیر فیلد ها ، خصیصه ها و …) بعد از ایجاد شی قابل تغییر نباشد. در چارچوب دات نت، کلاس string به این صورت پیاده سازی شده است. زمانی که شما یک مقدار رشته ای را در یک متغیر از نوع string قرار می دهید و بعدا آن مقدار را تغییر می دهید، کامپایلر #C در پشت صحنه یک شیء با مقدار جدید می سازد و در فیلد مورد نظر قرار می دهد و شیء قبلی را دور می اندازد (توسط garbage collector پاک می کند) :

string Name = "Jason"; // First time it creates a new object.
Name = "Jack";         // It create a new object of string type

در کد زیر شما یک کلاس با نام Person را مشاهده می کنید که شامل دو فیلد با نام های name و family است. این دو فیلد به صورت readonly و از نوع string تعریف شده اند.فیلد های readonly تنها می توانند در خط تعریف فیلد یا در سازنده کلاس مقدار دهی شوند. سپس برای این دو فیلد، خصوصیات متناظری ایجاد می کنیم. خصوصیت هم فقط از قسمت get تشکیل شده است و نباید قسمت set داشته باشد. زیرا کاربر بعد از ایجاد شیء نباید مقادیر درون شیء را تغییر دهد. مقادیر مورد نظر را از طریق پارامتر های سازنده کلاس می گیریم و در فیلدها قرار می دهیم :

public class Person
{
    private readonly string name;
    private readonly string family;

    public string Name
    {
        get
        {
            return this.name;
        }
    }

    public string Family
    {
        get
        {
            return this.family;
        }
    }

    public Person(string n, string f)
    {
        this.name = n;
        this.family = f;
    }
}

نحوه ی استفاده از کلاس فوق به صورت زیر می باشد :

Person person1 = new Person("Jason", "Statham");

person1.Name = "Jack";

Console.WriteLine(person1.Name + " " + person1.Family);
Console.ReadKey();

در کد بالا نمی توانیم بعد از ایجاد شیء مقادیر خصوصیات آن را تغییر دهیم.زیرا خصوصیات فقط از قسمت get تشکیل شده اند. پس خط قرمز در مثال بالا غیر مجاز می باشد.