به تکه کد زیر یک نگاهی بکنید:
1 2 3 |
string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); |
دو تا متغیر از نوع رشته در سی شارت درست کرده ایم. سپس با متد ReferenceEquals مربوط به کلاس object بررسی کرده ایم که آیا reference این دو متغیر یکسان هستند یا نه. همون طور که می دانید string از انواع Reference هستش، باید دو متغیری که درست کرده ایم با دو رفرنس متفاوت باشند. در واقع دو object جداگانه برای هر کدام ایجاد شده باشد. ولی این طور نیست! و نتیجه متد ReferenceEquals نشون میده که این دو متغیر از نظر reference یکسان هستند! یک مقداری بی معنی به نظر میرسه. ولی دلیل این اتفاق این است که دات نت برای درست کردن مقادیر از نوع string از یک مکانیزم به نام pool استفاده می کنه. وقتی شما یک مقدار رشته ای رو ایجاد میکنید اگر این مقدار در pool مورد نظر باشه اشاره گری به اون برگردونده میشه، این کار رو نمیکنه که یک شی جدید برای اون بسازه. جالبه! یکی از دلایلی که string ها immutable هستند هم همینه! جالبه…
به نظر من Immutable بودن string ارتباطي به بحث pool نداره!
وقتي يك string رو تغيير بديم شي قبلي بدون ريفرنس رها ميشه و شي جديدي ايجاد ميشه(اگه اين شي جديد در pool موجود باشه همين شي استفاده ميشه)
اگر string ها immutable نباشند موضوع pool چگونه پیاده سازی خواهد شد؟ بسیار دشوار نخواهد بود؟