PDA

View Full Version : سوال: string يك refrence type هست پس چرا با new روي heap مقدار دهي نميشه؟



mehdihadeli
پنج شنبه 01 مهر 1389, 01:01 صبح
string يك refrence type هست پس چرا با new روي heap مقدار دهي نميشه

در اين كد آيا intialize متغيير رفرنس ما (همان new) بجاي استفاده از new string() از يك عبارت رشته اي داخل " " استفاده ميشه؟


string a="";

mehdi.mousavi
جمعه 02 مهر 1389, 00:49 صبح
string يك refrence type هست پس چرا با new روي heap مقدار دهي نميشه در اين كد آيا intialize متغيير رفرنس ما (همان new) بجاي استفاده از new string() از يك عبارت رشته اي داخل " " استفاده ميشه؟
string a="";

سلام.
سلام.
بله، string یه reference type هستش. اما وقتی اونو با Literal ها Initialize می کنید، جای اینکه در کد IL از newobj instruction استفاده کنه، از ldstr استفاده میکنه (که مخفف load string هستش). البته شما میتونید در صورت نیاز، توی کدهای Unsafe خودتون در C# از new برای ایجاد یه string استفاده کنید (http://msdn.microsoft.com/en-us/library/system.string.string.aspx).

به بیان دیگه، برای کد

string s = "safe";

IL زیر تولید میشه:

ldstr "safe"

ولی برای این کد:


unsafe
{
string s2 = new string("unsafe".ToCharArray());
}


این IL تولید میشه:

newobj instance void [mscorlib]System.String::.ctor(char[])

موفق باشید.

amir-yeketaz
جمعه 02 مهر 1389, 01:05 صبح
بخشید استاد ... میشه بگین چرا استفاده از کلاس String ناامن محسوب میشه ... و همین طور میشه بگین اون مورد نیازش چیه؟؟؟

mehdi.mousavi
جمعه 02 مهر 1389, 01:23 صبح
بخشید استاد ... میشه بگین چرا استفاده از کلاس String ناامن محسوب میشه ... و همین طور میشه بگین اون مورد نیازش چیه؟؟؟

سلام.
من نگفتم استفاده از کلاس string ناامن هستش. :لبخندساده: گمان میکنم خیلی هم امن باشه (جدا از مسائلی که SecureString (http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx) اونها رو Handle میکنه). اگر منظورتون unsafe keyword ای هستش که در مثال فوق استفاده کردم، باید بگم که Code Block ای که از این keyword استفاده میکنه نیز تحت نظر CLR اجرا میشه اما به شما اجازه میده تا حافظه رو مستقیما آدرس کنید. وقتی کدتون رو با unsafe علامت گذاری کنید، .NET به کد شما اعتماد میکنه و امیدواره که کد شما، هنگام دستکاری حافظه، اشتباهی مرتکب نشه (چون میتونه این اشتباه آسیب پذیری های امنیتی ای رو در برنامه در پی داشته باشه و ...).

موفق باشید.

sheytan69
پنج شنبه 01 تیر 1391, 12:45 عصر
سلام دوست عزيز--يه سوال؟؟ اصلا چرا خود string از نوع Refrence هست؟ ميشه كامل توضيح بديد؟

tooraj_azizi_1035
پنج شنبه 01 تیر 1391, 17:43 عصر
سلام
درست است که شما از کلمه کلیدی new استفاده نمی کنید اما با این حال فضایی در Heap به رشته شما اختصاص داده می شه در ضمن این یک امکان هست که در اختیار برنامه نویس قرار داده شده و شما می توانید از new هم استفاده کنید که در این صورت Option های بیشتری برای مقداری دهی اولیه خواهید داشت.

روش های نمونه سازی از روی رشته ها:


با انتساب یک مقدار رشته ای
با فراخوانی سازنده کلاس String
با استفاده از عملگر تلفیقی جهت ترکیب چند نمونه رشته و تولید یک رشته کامل
با بازیابی مقدار یک property یا متدی که مقداری رشته ای را باز می گرداند
با فراخوانی متد String.Format برای تبدیل یک مقدار یا شیء به نمایش رشته ای آن (String Representation)

مقدار یک شیء string غیر قابل تغییر یا immutable است زیرا پس از ایجاد قابل تغییر نیست. از کلاس StringBuilder برای ایجاد رشته قابل تغییر باید استفاده کرد.


اینکه چرا رشته ها از نوع Reference هستند:

نوع های داده ای یا Value Type هستند یا Reference Type.
حافظه مورد نیاز Value Type ها در Stack تامین می شود و Reference Type ها در Heap.

هم Value Type و هم Reference Type ها از کلاس System.Object مشتق می شوند.

88569

علت آن که رشته یک Reference Type است این است که Reference Type ها باید در Heap نگه داری شوند چون برداشتن و گذاشتن اشیا در Heap به ترتیب خاصی نیاز ندارد اما در پشته اولین عنصر وارده حتماً باید در آخر برداشت شود حالا اگر چندین رشته روی هم در پشته قرار بگیرند و برنامه بخواهد یک رشته که در وسط قرار دارد را بردارد چطور باید عمل کند؟ باید رشته های رویی را به جایی از حافظه کپی کند تا بتواند آن رشته را بردارد و سپس دوباره رشته های کپی شده را به محل سابق برگرداند. پشته با یک اشاره Top کار می کند اما در Heap آدرس هر شیء توسط یک متغیر نگداری می شود که به آسانی قابل دستیابی است.


منبع :

http://www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory01122006130034pm/csharp_memory.aspx