PDA

View Full Version : مقدار دهی object دوم ؟



zoncpp
یک شنبه 13 دی 1388, 09:23 صبح
سلام.
من در C# خیلی حرفه ای نیستم.
در برنامه ام کلاسی تعریف کرده ام و از آن یک object ساخته ام. کد زیر را ببنید.

CMyClass objMyClass = new CMyClass();
objMyClass.Open();
objMyClass.Initialize();
CMyClass objMyClass_2 = new CMyClass();
objMyClass_2 = objMyClass;
objMyClass.Close();
در این کد من object اول را close می کنم. (close یکی از تابعهای کلاسم هست) اما object دوم هم گویا close می شود، چون بعد از آن با object دوم هم نمی توانم کار کنم.

در اصل من می خواهم object را open و مقداردهی کنم و این object مقداردهی شده را در thread تحت object دومی استفاده کنم درحالی که object اول آزاد شده و خارج از thread قابل استفاده مجدد باشد.

حالا کی می تونه راهنماییم کنه؟

negin_2009
یک شنبه 13 دی 1388, 10:22 صبح
شاید اپراتور مساوی را ، برای مقدار دهی object ها در C# ، اشتباه به کار بردی و متدی دیگری باید استفاده کنی!

zoncpp
یک شنبه 13 دی 1388, 16:00 عصر
از Copy Constructor هم استفاده کردم، همچنان مشکل دارد.
کسی نمی تونه کمکم کنه؟!

اَرژنگ
یک شنبه 13 دی 1388, 16:17 عصر
از Copy Constructor هم استفاده کردم، همچنان مشکل دارد.
کسی نمی تونه کمکم کنه؟!
بعد از این خط :
objMyClass_2 = objMyClass;

هم objMyClass و هم objMyClass_2 دارند به یک نمونه اشاره میکنند و نه به دو نمونه متفاوت.
پس وقتی که را صدا میزنید فقط یک نمونه بسته میشه، نمونه دیگر که ساخته شده بود به احتمال زیاد Dispose شده.

Sajjad.Aghapour
یک شنبه 13 دی 1388, 18:55 عصر
objMyClass_2 = objMyClass;


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

zoncpp
دوشنبه 14 دی 1388, 08:07 صبح
objMyClass_2 = objMyClass;


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

حدس می زدم که این اتفاق می افته. ولی چه کار کنم پس؟ آیا راه حلی وجود نداره؟


درضمن از امضات خیلی خوشم اومد و کاملا موافقم: همواره ساز سادگیمان کوک باشد و نگاهمان امیدوار ....

اَرژنگ
سه شنبه 15 دی 1388, 07:23 صبح
حدس می زدم که این اتفاق می افته. ولی چه کار کنم پس؟ آیا راه حلی وجود نداره؟



۱.این کد را



CMyClass objMyClass = new CMyClass();
objMyClass.Open();
objMyClass.Initialize();

به این یکی تغییر بدید


CMyClass objMyClass= new CMyClass();
objMyClass.Open();

public class CMyClass
{
public CMyClass()
{
//contructor code here

//last line go and initialise yourself
this.Initialize();
}
private void Initialize()
{
//Your initialise code here
}
public void Open()
{
//Code for open here
}
}

بعدش هم لطفاً بیان کنید که با این روش به چه نتیجه‌ای میخواهید برسید ، چونکه مشکل اصلی شما ندانستن سی‌شارپ نیست، بنیان روشتان اشتباهست.
پ.ن: اشتباه بودن روش ربطی به ( شخص ) شما ندارد، اگر هدفتان را دریابیم به رسیدن بهش با روش درست کمک میکنیم.

zoncpp
سه شنبه 15 دی 1388, 11:56 صبح
مشکل در هندلهایی بود که در تابع open مقداردهی می شد و با close کردن object این هندلها نیز Close می شدند و در نتیجه هندلهایی هم که به object دوم منتقل شده بودند close می شدند.
مشکلم رو از طریق دیگه ای حل کردم.
ممنون از پاسخ های شما دوستان.

اَرژنگ
سه شنبه 15 دی 1388, 11:59 صبح
مشکل در هندلهایی بود که در تابع open مقداردهی می شد و با close کردن object این هندلها نیز Close می شدند و در نتیجه هندلهایی هم که به object دوم منتقل شده بودند close می شدند.
مشکلم رو از طریق دیگه ای حل کردم.
ممنون از پاسخ های شما دوستان.
هندل منتقل شدن یعنی چی؟ منظورتان اصلاً مشخص نیست. اصلاً چطوری ۲ تا ابجکت به هم منتقل شدن دارند؟