PDA

View Full Version : سوال: ندادن مقدار اولیه به یک متغیر در c#



فاطمه_14
پنج شنبه 28 اردیبهشت 1391, 13:38 عصر
سلام
1- آیا با ندادن مقدار اولیه تخصیص حافظه برای اون متغیر صورت نمی گیرد؟

arash ghafori
پنج شنبه 28 اردیبهشت 1391, 14:02 عصر
تخصیص حافظه صورت می گیرد . اگه نمیگرفت چیزی به اسم اشاره گر وجود نداشت.

فاطمه_14
پنج شنبه 28 اردیبهشت 1391, 14:16 عصر
فقط متغیرهای عددی اند که هنگام تخصیص حافظه با کلمه ی کلیدی new مقدار اولیه میگیرند؟

arash ghafori
پنج شنبه 28 اردیبهشت 1391, 15:27 عصر
فقط متغیرهای عددی اند که هنگام تخصیص حافظه با کلمه ی کلیدی new مقدار اولیه میگیرند؟

نه String ها هم از New استفاده میکنند.
New یه کلمه ی کلیدیه که اون شی در حافظه ی Heap ایجاد شود. یعنی در Register ، که دسترسی به اون سریع تر از دسترسی به متغیر های دیگره.

فاطمه_14
پنج شنبه 28 اردیبهشت 1391, 17:40 عصر
نه String ها هم از New استفاده میکنند.
New یه کلمه ی کلیدیه که اون شی در حافظه ی Heap ایجاد شود. یعنی در Register ، که دسترسی به اون سریع تر از دسترسی به متغیر های دیگره.

نه منظورم این نیست که کدوم متغیرها از new استفاده می کنند منظور من اینه که آیا فقط متغیرهای عددی اند که هنگام تخصیص حافظه با کلمه ی کلیدی new , مقدار اولیه میگیرند؟

فرید نجفلو
پنج شنبه 28 اردیبهشت 1391, 19:14 عصر
سلام
ببیند اتفاقا new مخصوص متغیر های غیر اولیه (string,bool,int,...) هست ولی میشه با اونا هم استفاده کرد
اگه با انواع اولیه استفاده بشه اون متغیر مقدار پیش فرض می گیره (واسه اعداد صفر ، رشته ای یک رشته خالی و ...)
اما متغیر های غیر اولیه:
این متغیر ها از یک کلاس دات نتی ، کمپوننت یا یه کلاس ساخته شده توسط خودتون ایجاد می شن

Form frm;
EventArgs e;
myClass mc;


تو کد های بالا متغیر ها تعریف شدن ولی هیچ حافظه ای واشون تخصیص داده نشده (همگی مقدار null دارن)
وقتی اگه کد به صورت زیر باشه:

Form frm = new Form();
EventArgs e = new EventArgs();
myClass mc = new myClass();


متغیر ها تعریف و در Heap به اونها یک فضا اختصاص داده میشه پس تخصیص حافظه هم صورت میگیره

توجه کنید که ما دو نوع متغیر داریم (مقداری و ارجاعی):
انواع اولیه و ساختار ها(strut) از نوع مقداری هستند که در stack قرار می گیرن
انواع ارجاعی که تو کد های بالا مشاهده می کنید در Heap ایجاد می شن

گاهی هم نیاز به تبدیل اینها به همدیگه هست که عملیات Boxing و Unboxing انجام می شه

این توضیحات مختصر و کلی بودن که می تونید بیشتر دربارش تحقیق کنید از MSDN هم استفاده کنید
دنبال این کلمات باشید:
new
Value-type
reference-type
Heap
Boxing
Unboxing

فاطمه_14
پنج شنبه 28 اردیبهشت 1391, 20:44 عصر
اگه با انواع اولیه استفاده بشه اون متغیر مقدار پیش فرض می گیره (واسه اعداد صفر ، رشته ای یک رشته خالی و ...)
من متاسفانه نرم افزار msdn رو ندارم اگه میشه کمکم کنید
من وقتی
string a=new string; می نویسم باز مقدار a متغیر null ه ولی آخه شما گفتید یه رشته ی خالیه؟شاید من اشتباه نوشتم! اگه اشتباه نوشتم میشه درستشو بنویسید

فرید نجفلو
پنج شنبه 28 اردیبهشت 1391, 22:16 عصر
سلام
بله من گفتم مقدار پیش فرض string یه رشته خالیه ولی تو سی شارپ به این صورت عمل نمیشه و string سازنده(constructor) پیش فرض (بدون پارامتر نداره)
خوب اینکار ها تو VB.NET یکی از مسائل جا افتاده است ولی کامپایلر بسیار محتاط سی شارپ اجازه این کار ها ر.و نمی ده
به هر حال برای رشته ها و در کل انواع اولیه تخصیص صریح راحترین و معقولانه ترین راه هست:
string a ="";
int b=0;

فرید نجفلو
پنج شنبه 28 اردیبهشت 1391, 22:22 عصر
حالا که بحث پیش اومد لازم دونستم در مورد string چند ا مطلب بگم
در مورد نوع string هم باید گفت درسته که در گروه انواع اولیه قرار داره ولی یه تفاوت اساسی با اونا داره
اینکه string برعکس اونا از نوع ارجاعی هست و تو Heap قرار می گیره
این نوع یکی از انواع قابل بحث هست چون:
در حالی که از نوع ارجاعی هست ولی با == دو رشته باهم برابرند اگه مقدارشون برابر باشه و ممکنه ارجاعات جداگانه داشته باشن (برعکس سایر انواع ارجاعی)
یعنی ممکنه تو کد زیر خط اول true باشه ولی خط دوم false(توجه کنید که string ها از نوع ارجاعی هستند):
a==b;
(object)a == (object)b;
اگر بنویسیم
string a="a";
string b;
b=a
این دو دارای ارجاعی یکسان هستند و دریک مکان مشابه در حافظه قرار دارن (همانند مقادیر ارجاعی)
ولی چنانچه در ادامه بنویسید
b="b"
در این لحظه a با مقدار "a" و متغیر b با مقدار "b" هر کدام در یک مکان جداگانه در حافظه قرار دارن(برعکس مقادیر ارجاعی)!!!

و اینکه مقادیر رشته ای فقط خواندنی هستند یعنی در اصل نمی شه اونا رو درون حافظه ویرایش کرد و قتی شما یک رشته رو ویرایش می کنید در واقع رشته قبلی از بین رفته و یک رشته جدید جای اون رو می گیره

رشته ها در نوع خود یکی از عجیبترین انواع هستند!