PDA

View Full Version : سوال: تفاوت constructor با Destructor



SAMANEH_E
دوشنبه 27 آبان 1387, 23:26 عصر
سلام بر دو ستان .
با توجه با آشنایی جزیی با Destructor ولی هنوز نتونستم درکش کنم و تفاوت اونو باconstructor بفهمم . اگه از دوستان مطلب بیشتری میدونه ممنون میشم راهنمایی کنند.

molana alavi
دوشنبه 27 آبان 1387, 23:49 عصر
یکی از دلایل محبوببیت سی شارپ در برابر سی پلاس پلاس همین رها شدن از دست مخرب هستش

hamed aj
سه شنبه 28 آبان 1387, 00:10 صبح
با سلام

همونطور که می دونید constructor یا سازنده، در واقع متدی هست که برای مقدار دهی اولیه فیلد های یک کلاس و تنظیمات اولیه شیء استفاده می شود. در واقع constructor ، شیء را برای استفاده محیا می کند.

Destructor یا مخرب، عکس عمل بالا را انجام می دهد. یعنی حذف شیء و آزاد سازی منابع سیستم

البته در #C همانند جاوا از مخرب استفاده نمی شود. بلکه این عمل بصورت پویا توسط GC یا garbage collector انجام می شود. یعنی نیازی به نوشتن متد Destructor برای اشیاء نیست (در ++C این متد نیاز بود)

موفق باشید

SAMANEH_E
سه شنبه 28 آبان 1387, 08:41 صبح
با سلام

همونطور که می دونید constructor یا سازنده، در واقع متدی هست که برای مقدار دهی اولیه فیلد های یک کلاس و تنظیمات اولیه شیء استفاده می شود. در واقع constructor ، شیء را برای استفاده محیا می کند.

Destructor یا مخرب، عکس عمل بالا را انجام می دهد. یعنی حذف شیء و آزاد سازی منابع سیستم

البته در #C همانند جاوا از مخرب استفاده نمی شود. بلکه این عمل بصورت پویا توسط GC یا garbage collector انجام می شود. یعنی نیازی به نوشتن متد Destructor برای اشیاء نیست (در ++C این متد نیاز بود)

موفق باشید

ممنون از اینکه توضیح دادی ولی اگه کسی میتونست تو این زمینه مثال بزنه بهتر میشد.

hegmatane
جمعه 01 آذر 1387, 12:18 عصر
اينم مثال:


class linkList {
public:
linkList();
~linkList();
void addNode();
void delNode(int &);
void display();
private:
node *first;
node *last;
};
//*****************
linkList::linkList()
{
first = last = NULL;
}
//************
linkList::~linkList()
{
node *curPtr = first;
node *temp;
while(curPtr) {
temp = curPtr;
curPtr = curPtr -> next;
delete temp;
}
}

huni_1989
جمعه 01 آذر 1387, 18:13 عصر
سلام
دیستراکتور در واقع تابعی هست که در c++ به شکل کلی () destructor~ وجود داشت. کار این تابع آزاد کردن فضا های اشغال شده ای بود که توسط new مشغول شده بودند.
در داخل دیستراکتور با استفاده از عملگر delete حافظه های new شده به صورت دستی از بین می رفتند.
این از c++

اما توی c# و java یه کلاسی به نام gc به وجود اومد که به طور ضمنی در هنگام کار برنامه به صورت هوشمند فضاهای اشغال شده که دیگه به درد نمی خوره رو حذف می کنه.
gc مخفف کلمه ی garbage cleaner هست.

اگه شما با c# کار می کنید می تونید با خیال آسوده و بدون توجه به فضا های اشغال شده برنامه ی خودتون رو بنویسید.

امیدوارم به دردتون خورده باشه ;)

SAMANEH_E
جمعه 01 آذر 1387, 18:59 عصر
سلام
دیستراکتور در واقع تابعی هست که در c++ به شکل کلی () destructor~ وجود داشت. کار این تابع آزاد کردن فضا های اشغال شده ای بود که توسط new مشغول شده بودند.
در داخل دیستراکتور با استفاده از عملگر delete حافظه های new شده به صورت دستی از بین می رفتند.
این از c++

اما توی c# و java یه کلاسی به نام gc به وجود اومد که به طور ضمنی در هنگام کار برنامه به صورت هوشمند فضاهای اشغال شده که دیگه به درد نمی خوره رو حذف می کنه.
gc مخفف کلمه ی garbage cleaner هست.

اگه شما با c# کار می کنید می تونید با خیال آسوده و بدون توجه به فضا های اشغال شده برنامه ی خودتون رو بنویسید.

امیدوارم به دردتون خورده باشه ;)

با تشکر از توضیحتون . پس با این اوصاف استفاده ازش کاربرد خاصی نداره

Salar Ashgi
جمعه 01 آذر 1387, 19:37 عصر
سلام ، همانطور که دوستان گفتند تو سی شارپ و جاوا Garbage Collection وجود داره

و مدیریت حافظه توسط خود کامپایلر انجام میشه و نیازی به کنترل آن توسط برنامه نویس

نیست !!!

اما در ++C :

شباهت های دو تابع سازنده و مخرب : هر دو هیچ مقدار برگشتی ندارند !!!

تفاوت های دو تابع سازنده و مخرب : تابع مخرب مقدار ورودی (آرگومان) نیز ندارد ولی تابع

سازنده میتواند هر تعداد ورودی (متناسب با فیلد های داده ای کلاس ) داشته باشد !!!

نکته : هر کلاسی میتواند در صورت نیاز ، هر تعداد تابع سازنده داشته باشد ، حال آنکه

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

امیدوارم مطلب ارائه شده مفید بوده باشد !!!!

موفق و پیروز باشید !!!!

Mehdi Asgari
جمعه 01 آذر 1387, 20:29 عصر
یکی از دلایل محبوببیت سی شارپ در برابر سی پلاس پلاس همین رها شدن از دست مخرب هستش
سی شارپ مخرب داره ، فقط deterministic نیست (برخلاف سی پلاس پلاس)

با تشکر از توضیحتون . پس با این اوصاف استفاده ازش کاربرد خاصی نداره
اصلا اینطور نیست. توضیحات دوستان وقتی درسته که ما در یک محیط کاملا مدیریت شده زندگی کنیم. در حالی که ما در کار های روزمره مون با اشیایی از دنیای unmanaged مثل هندل فایل ، database ، network (و هرگونه stream دیگری) و ... سروکار داریم. به طور خلاصه: ما باید هنگامی که کارمون با شی تموم شد ، منابع سیستمی اشغال شده رو آزاد کنیم. الگویی که در دات نت برای این کار وجود داره ، implement کردن IDisposable هست.
(در دات نت ، ما در دنیایی managed زندگی می کنیم و اکثر کارهای مربوط به مدیریت حافظه به صورت خودکار انجام میشه ، و فرق یک برنامه نویس خوب و معمولی در چیزای جزئی و کمتر استفاده شونده ای! مثل GC ، Marshal ، پوینتر ، هندل ، .... هست)

صفحات 469 و 485 کتاب CLR Via C# رو بخونید. همینطور بخش اول فصل 11 کتاب Professional .NET Framewrok 2.0
http://www.codeproject.com/KB/dotnet/ForDotNetBeginner.aspx
http://www.eggheadcafe.com/articles/20050625.asp
http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

saeed-kh
شنبه 02 آذر 1387, 01:20 صبح
سلام سازنده رو که میدونید . اما مخرب تقریبا همونی هست که دوستان گفتن. مخرب تقریبا خودکار عمل میکنه وقتی از شیئی خارج میشیم و یا بسته میشه همه منابع اون آزاد میشه اما میشه اونا رو خودمون هم مدیریت کنیم با یه متد همنام با کلاس اما اوا اسمش باید از علامت ~ استفتده کنیم
public class aClass
{
~aClass()
{
// Clean up code goes here
}
}
اما من یه پاراگراف از خود مایکروسافت رو عینا براتون میزارم بخونید
The constructor is the first method called on instantiation of a type. The constructor provides a way to set default values for data or perform other necessary functions before the object is available for use. Destructors are called just before an object is destroyed and can be used to run clean-up code. Since object cleanup is controlled by the common language runtime, you cannot control when a destructor is called.

forodo
سه شنبه 20 خرداد 1393, 16:27 عصر
سلام
می دونم خیلی قدیمی هستش ولی می خوام دیگه تاپیک ایجاد نکنم.
بالاخره همیشه بنویسیم یا نیازی نیست.
و فرقDestructor با Dispose چیه؟
public class Test
{
~Test()
{
MessageBox.Show("Destructor was called.");
}

public void ali()
{
MessageBox.Show("ali");
}

// توابع دیگر
}
private void Form1_Load(object sender, EventArgs e)
{
Test t = new Test();
t.ali();
}
پیغام تابعDestructor که میاد خودش بعد از 2 ثانیه از بین می ره.