PDA

View Full Version : تفاوت int و ()new int



whatsoop
شنبه 01 تیر 1387, 07:40 صبح
با سلام خدمت همه دوستان و اساتید برنامه نویس.

چندوقتی میشه که از مطالب سایت انجمن استفاده میکنم و معمولا با سرچ کردن به جواب سوالهام میرسم، ولی امروز دیگه مجبورشدم برای جواب گرفتن سوال چندین ساله ام عضو بشم!

مشکلی که دارم مربوط میشه به مفهوم OOP و کی ورد new و به زبان خاصی تعلق نداره ولی چون تو انجمن بخشی برای مباحث OOP پیدا نکردم و از طرف دیگه چون با #C برنامه مینویسم تو این قسمت مطرحش کردم. امیدوارم از راهنماییهای دوستانی که تو بخشهای دیگه (مخصوصا ++C ) تبحر دارن محروم نشم .

اما سوال اصلی:




What's the difference between

int intVar;
and

int intVar = new int();? :-?
تفاوت بین int intVar; و int intVar = new int(); چیه؟ و کلا تفاوت هر متغیری که به صورت معمول تعریف میشه با متغیری که به صورت یه آبجکت از یه کلاس تعریف میشه چیه؟

مثلا کد زیر رو در نظر بگیرید:

int intVar;
int clssVar = new int();
intVar = 123;
clssVar = 123;
System.Console.WriteLine("clssVar: {0}\nintVar: {1}", clssVar, intVar);
تفاوت intVar با clssVar چیه؟ تو مقدار حافظه ای که اشغال میکنند تفاوت دارند؟

لطفا اگر فرصت توضیح دادن ندارید یه رفرنس برای یافتن جواب بهم معرفی کنید.

با تشکر فراوان

ASKaffash
شنبه 01 تیر 1387, 09:03 صبح
با سلام
کلمه new یک شی جدید را ایجاد میکند در اینجا ()int مربوط به Constructor کلاس INT32 است که نمونه پیاده سازی شده از کلاس را باز میگرداند
دستور int intVar; یک متغییر عددی ایجاد میکند که مقدار دهی آن بعدا باید انجام شود واگر انجام نگیرد با خطا مواجه میشوید که درخط intVar = 123; انجام شده است ودستور int clssVar = new int(); یک متغییر عددی ایجاد کرده وچون Constructor کلاس int جلوی new اعلام شده است مقدار شی ایجاد شده بوسیله Constructor مقدار دهی اولیه شده است امیدوارم توانسته باشم مفهوم را برسانم

درضمن هیچ فرقی باهم ندارند چون اولی قراراست بعدا مقدار دهی شود.

مهدی کرامتی
شنبه 01 تیر 1387, 09:16 صبح
فرقی ندارند، چون int یک Value Type است و Value Type ها برای استفاده نیاز به ایجاد Instance با استفاده از دستور new ندارند.

Mahdi.Kiani
شنبه 01 تیر 1387, 11:39 صبح
فرقشون اینه که زمانی که شما در متد ها، نخواهید از مقدار صریح استفاده کنید، می تونید مقدار پیش فرض آن نوع را برای متغیر خود انتخاب کنید. (توسط فراخوانی Constructor آن)

به عنوان مثال
کد زیر Error خواهد داد:




int DoSth()
{
int a;
return a;
}

// compil error : Use of unassigned local variable 'a'




که برای حلش دو راه وجود دارد

راه اول :




int DoSth()
{
int a=10;//or others value which you want
return a;
}



راه دوم :




int DoSth()
{
int a = new int();
return a;
}



که راه دوم معادل است با :




int DoSth()
{
int a = 0;
return a;
}




به این دلیل که مقدار پیش فرض برای نوع های عددی شامل Byte، Int و ... مقدار 0 می باشد

علاوه بر این موارد، شما می توانید خاصیت جدیدی به value Type ها اضافه کند که بتوانند مقدار Null را درون خود نگه داری کنند.

نحوه تعریف:
اضافه کردن ? به Type مورد نظر هنگام تعریف




int? a=null;



دقت کنید که در این حالت، متغیر a می توند مقدار Null بگیرد.

علاوه بر این دو property که البته به صورت readonly نیز می باشند به متغیر جدید شمااضافه می شوند که عبارتند از:

1) Hasvlue : اگر مقدار متغیر شما Null نباشد، مقدار true و در غیر این صورت مقدار false بر می گرداند.
2) Value : مقدار متغیر را در صورت معتبر بودن آن

مثال




void DoSth()
{
int? a=null;
if (a.HasValue)
MessageBox.Show(a.Value.ToString());
else
MessageBox.Show("Value Is Null");

}




موفق باشید

sinpin
شنبه 01 تیر 1387, 11:45 صبح
پاسخ آقاي ASKaffash (http://barnamenevis.org/forum/member.php?u=63973) به تنهايي گويا بود :

با سلام
کلمه new یک شی جدید را ایجاد میکند در اینجا ()int مربوط به Constructor کلاس INT32 است که نمونه پیاده سازی شده از کلاس را باز میگرداند
دستور int intVar; یک متغییر عددی ایجاد میکند که مقدار دهی آن بعدا باید انجام شود واگر انجام نگیرد با خطا مواجه میشوید که درخط intVar = 123; انجام شده است ودستور int clssVar = new int(); یک متغییر عددی ایجاد کرده وچون Constructor کلاس int جلوی new اعلام شده است مقدار شی ایجاد شده بوسیله Constructor مقدار دهی اولیه شده است امیدوارم توانسته باشم مفهوم را برسانم

درضمن هیچ فرقی باهم ندارند چون اولی قراراست بعدا مقدار دهی شود.

whatsoop
شنبه 01 تیر 1387, 14:36 عصر
با تشکر از همه دوستان و مخصوصا جناب کیانی که مفصل توضیح دادند.

1- با این توضیحات استفاده از new بهتر و کاملتر به نظرمیرسه پس بهتر نیست که از این به بعد همیشه حتی برای تعریف int و char ازش استفاده کنم؟

2- توی یه کتاب دیدم که برای تعریف چندتا استرینگ به این شکل عمل کرده بود:

string strTst1 = new String("Hello World!");
string strTst2 = new String('a', 10);
...

وقتی کد رو ران کردم به جز strTst1 بقیه stringها به درستی تعریف شدن. مشکل چی بود که Hello World تعریف نمیشه؟ آیا کتاب اشتباه نوشته بود؟

3- لطفا مرجعی برای مطالعه درمورد این بحث مطرح کنید.
باز هم تشکرمیکنم.

Mahdi.Kiani
شنبه 01 تیر 1387, 16:52 عصر
1- با این توضیحات استفاده از new بهتر و کاملتر به نظرمیرسه پس بهتر نیست که از این به بعد همیشه حتی برای تعریف int و char ازش استفاده کنم؟



خیر. چون معادل new کردن، مانند این است که مقدار آن را صفر دهید. و چون معمولا این روش راحت تر می باشد، بیشتر از همین روش استفاده می شود.
در واقع در متد ها، با مقدار اولیه خودتون و در کلاس ها هم که نیاز نیست چون خودش اتوماتیک مقدار دهی اولیه می کند.




2- توی یه کتاب دیدم که برای تعریف چندتا استرینگ به این شکل عمل کرده بود:
[CODE]string strTst1 = new String("Hello World!");
string strTst2 = new String('a', 10);

وقتی کد رو ران کردم به جز strTst1 بقیه stringها به درستی تعریف شدن. مشکل چی بود که Hello World تعریف نمیشه؟ آیا کتاب اشتباه نوشته بود؟


String یک کلاس می باشد( بر خلاف int و double و ... که Struct می باشند) پس Reference type می باشد. در Constructor های این کلاس Overload ای برای فرستادن String (به این شکل)وجود ندارد. به هین دلیل خطا می دهد.




3- لطفا مرجعی برای مطالعه درمورد این بحث مطرح کنید.
باز هم تشکرمیکنم.



1)اکثر کتاب های C# انگلیسی و خوب به این مطالب پرداخته اند.
2) MSDN
3) گوووووووووووووووووووووووو ووووووووووووووووگل

موفق باشید