PDA

View Full Version : دستور new



emad_67
چهارشنبه 03 مرداد 1386, 01:01 صبح
کد زیر رو ببنید


Random obj=new Random();

حالا سوالم اینه که چرا باید از دستور new استفاده بشه مگه با نوشتنه Random obj یک شیء از کلاس Random ساخته نمیشه؟
من تازه C# رو شروع کردم به خاطر همین طبق چیزایی که از c++ بلدم این منطقی نیست ببخشید دیگه پیش و پا افتادست سوالم

PC2st
چهارشنبه 03 مرداد 1386, 01:22 صبح
با دستور Random obj یک حافظه stack به متغیر obj اختصاص داده میشه که این متغیر میتونه به یک شئ از نوع Random (در حافظه heap) اشاره کنه...
و با دستور ()new Random یک شئ از نوع Random در حافظه heap ایجاد (نمونه سازی) میشه که متغیر obj به این شئ اشاره میکنه و توسط این متغیر، میشه به این شئ دسترسی داشت.
در واقع، اون چیزی که باعث میشه یک شئ از Random ایجاد بشه، کلمه کلیدی new است.

mehdi.mousavi
چهارشنبه 03 مرداد 1386, 01:42 صبح
کد زیر رو ببنید


Random obj=new Random();
حالا سوالم اینه که چرا باید از دستور new استفاده بشه مگه با نوشتنه Random obj یک شیء از کلاس Random ساخته نمیشه؟
من تازه C# رو شروع کردم به خاطر همین طبق چیزایی که از c++ بلدم این منطقی نیست ببخشید دیگه پیش و پا افتادست سوالم


سلام.
C# در این مساله کاملا متفاوت از C++ هستش. در C++ شما با نوشتن Random obj باعث میشید تا obj ای از نوع Random در local stack درست بشه. اما C#. دو نوع متفاوت به شما معرفی می کنه: class و struct. اولی reference type و دومی value type هستش.

شما با value-type ها می تونید اینکارو انجام بدید. مثلا:



public struct MyStruct
{
public int a;
}

MyStruct m;
m.a = 0;
و همه چیز مثل CPP به نظر خواهد رسید. اما در مورد Reference-type ها مساله متفاوت هستش. Reference-type ها به نوعی (عرض میکنم، به نوعی!) شبیه pointer ها در CPP هستن. Random یک کلاس هست و در نتیجه یه Reference-type. کد زیر رو در نظر بگیرید:


Random rnd;
rnd = new Random();
در خط اول ابتدا یک ریفرنس Allocate میشه. در خط دوم rnd، الوکیت میشه. اما یه نکته مهم در این رابطه:

کد زیر رو در نظر بگیرید:


Random rnd2 = rnd1;با این کار باعث میشم تا rnd2 یه کپی از reference متغیر rnd1 باشه و در نتیجه هر دو به یک object اشاره می کنن. در نتیجه اگر rnd2 رو تغییر بدم، rnd1 هم تغییر خواهد کرد. اما در مورد value-type ها چنین چیزی صادق نیست. مثلا کد زیر رو در نظر بگیرید:


MyStruct m2 = m1;این کد باعث بوجود اومدن نسخه متفاوتی از m1 با مقادیر m1 میشه. در نتیجه اگر m2.a رو تغییر بدیم، m1.a تغییری نخواهد کرد.

mehdi.mousavi
پنج شنبه 11 مرداد 1386, 21:50 عصر
کد زیر رو ببنید


Random obj=new Random();
حالا سوالم اینه که چرا باید از دستور new استفاده بشه مگه با نوشتنه Random obj یک شیء از کلاس Random ساخته نمیشه؟
من تازه C# رو شروع کردم به خاطر همین طبق چیزایی که از c++ بلدم این منطقی نیست ببخشید دیگه پیش و پا افتادست سوالم


سلام.
چون در مورد new پرسیده بودین، گفتم احتمالا نحوه عمل کردن Garbage Collector هم می تونه براتون جالب باشه. برای خوندن این مطلب به این پست رجوع کنید. (http://barnamenevis.org/forum/showpost.php?p=374058&postcount=11)