PDA

View Full Version : آزاد کردن فضای اشغال شده اشیاء



aghayex
یک شنبه 11 مهر 1389, 18:00 عصر
با سلام خدمت دوستان عزیز
سوال من اینه که مثلا ما یه شی رو تولید میکنیم ( کانکشن استرینگ ، دیتاست و...) بعد از اینکه کارمون باهاش تموم شد باید اونو ایسپوس کنیم یا خود برنامه اون فضا رو به رم برمی گردونه ؟

r00tkit
یک شنبه 11 مهر 1389, 18:58 عصر
connection string رو با using استفاده کن

dataset هم به وسیلهی GC خودش رلیز می شه

aghayex
یک شنبه 11 مهر 1389, 19:17 عصر
connection string رو با using استفاده کن

dataset هم به وسیلهی GC خودش رلیز می شه

با using یعنی چطور ؟

صباح فتحی
یک شنبه 11 مهر 1389, 19:48 عصر
using {sqlconnection con=new sqlconnection}

میلاد قاضی پور
یک شنبه 11 مهر 1389, 21:00 عصر
using پرانتزی نیست آکولاد داره{}

aghayex
یک شنبه 11 مهر 1389, 21:59 عصر
یعنی اگه تا حالا به این صورت sqlconnection con=new sqlconnection می نوشتم فضا رو آزاد نمی کرد؟
مگه هر شی که ما در محدوده ی یک بلوک که مثلا متعلق به یک دکمه هست رو تعریف می کنیم بعد از پایان از بین نباید بره ؟

صباح فتحی
یک شنبه 11 مهر 1389, 22:23 عصر
یعنی اگه تا حالا به این صورت sqlconnection con=new sqlconnection می نوشتم فضا رو آزاد نمی کرد؟ بعد از پایان از بین نباید بره ؟

خود سی شارپ GC داره و همرو تقریبا جم و جورمیکنه..using واسه اطمینانه البته اگه اشتباه نکنم

aghayex
یک شنبه 11 مهر 1389, 22:36 عصر
خوب این سوال می مونه پس چرا برنامه ای که من می نویسم فضای اشغالی که از رم می گیره تا 60 کیلوبایت می ره اما بزرگترین برنامه که در ویندوز کار می کنه از 25 کیلو بایت بالا نمیاد:متفکر:

k1csharpdeveloper
دوشنبه 12 مهر 1389, 03:04 صبح
سلام ما با dispode کردن اینکارو انجام میدیم وقتی connection ایجاد و open میکنی dispode میکنیش

FastCode
دوشنبه 12 مهر 1389, 08:18 صبح
نههههههه.
using پرانتز داره.
چرا یکی میگه,یه نفر دیگه قبوی میکنه؟

using (objX = new myClass())
{
objX.DoY();
}

aghayex
دوشنبه 12 مهر 1389, 09:40 صبح
بحث من اینه که چرا برنامه ای که فقط یک کار و در یک آن انجام میده اینقدر فضا از رم میگیره و بعد از اینکه کارش هم تموم میشه باز اون فضا اشغاله اما متاسفانه دوستان گیر دادن به اینکه پرانتزه یا بلوک:عصبانی:

صباح فتحی
دوشنبه 12 مهر 1389, 11:21 صبح
ای بابا خب چیزیو نمیدونید نظر ندید دیگه.....اه اعصاب ادمو خراب میکنید
شکل درستش اینه
همین الان تست کردم


private void button1_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection(@"Server=SABAH-PC\SABAHSQL;DataBase=tempdb;Integrated Security=True"))
{
SqlCommand com = new SqlCommand("select name from tb where id=2", con);
con.Open();
SqlDataReader d;
d = com.ExecuteReader();
d.Read();
textBox1.Text = d["name"].ToString();
con.Close();
}

}

mehdi.mousavi
دوشنبه 12 مهر 1389, 11:42 صبح
سلام.
اگر دستوراتی که میخواهید در Using Block بنویسید، محدود به یک خط میشه، میتونید {} ها رو نذارید. بطور مثال:

using (MyClass c1 = new MyClass())
c1.Test();

اما اگر بیش از یک خط باشه، باید حتما {} ها رو بنویسید:


using (MyClass c1 = new MyClass())
{
c1.Test();
c1.Test2();
}

به همین ترتیب، اگر قراره دو متغیر از یک نوع داده ای داشته باشید و هر دو Scope یکسانی دارند، میتونید بدین شکل عمل کنید:


using (MyClass c1 = new MyClass(), c2 = new MyClass())
{
c1.Test();
c2.Test();
}

دقت کنید که اینجا هنگام خارج شدن از بلاک using هر دو متغیر c1 و c2 (که از نوع MyClass هستند) بطور خودکار Dispose میشن.

آخرین حالت هم در استفاده از using حالتی هستش که شما نمیخواهید روی Instance ایجاد شده در درون Block کاری انجام بدید:

using (new MyClass())
{
}

بطور مثال میخواهید در ابتدای Block کرسر Mouse رو به حالت شنی ببرید، و در انتها، هنگام خروج از Block خودش بطور خودکار به حالت Default برگرده.


خوب این سوال می مونه پس چرا برنامه ای که من می نویسم فضای اشغالی که از رم می گیره تا 60 کیلوبایت می ره اما بزرگترین برنامه که در ویندوز کار می کنه از 25 کیلو بایت بالا نمیاداین اعداد و ارقام رو از کجا آورده اید؟ حتی اگر واحد رو اشتباه هم ذکر کرده باشید، چنین سقفی برای برنامه ها در ویندوز وجود نداره. (Firefox رو بطور نمونه باز کنید و ببینید چقدر حافظه به خودش اختصاص میده).

اما در مورد سوالی که فرموده بودید چرا پس از اتمام Code Block شما حافظه به سیستم برنمیگرده، باید خدمتتون عرض کنم که مدیریت حافظه بر اساس مکانیزم خاصی در .NET صورت میگیره. خوندن این مقاله (http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/) شما رو با این مکانیزم آشنا میکنه.

موفق باشید.

میلاد قاضی پور
دوشنبه 12 مهر 1389, 21:08 عصر
نههههههه.
using پرانتز داره.
چرا یکی میگه,یه نفر دیگه قبوی میکنه؟


ای بابا خب چیزیو نمیدونید نظر ندید دیگه.....اه اعصاب ادمو خراب میکنید
شکل درستش اینه
همین الان تست کردم

--------
پاسختون:



سلام.
اگر دستوراتی که میخواهید در Using Block بنویسید، محدود به یک خط میشه، میتونید {} ها رو نذارید. بطور مثال:




view source (http://barnamenevis.org/forum/showthread.php?t=251047#viewSource)

print (http://barnamenevis.org/forum/showthread.php?t=251047#printSource)? (http://barnamenevis.org/forum/showthread.php?t=251047#about)
1.using (MyClass c1 = new MyClass())
2. c1.Test();


اما اگر بیش از یک خط باشه، باید حتما {} ها رو بنویسید:




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



using(resource)
{

}

درسته که داخل پرانتز آرگومان مورد نظر باید وارد بشه اما خب شماهایی که شاکی شدید هم دقت کنید که خودتونم همچین کاملا صحیح مطلب رو ارائه نکردید .

صباح فتحی
دوشنبه 12 مهر 1389, 21:33 عصر
اوج بلند عزیز
من فقط کانکشن رو تو using نوشتم ارور داد(بعدش میگفت con نداریم)
مجبورشدم همررو توی{} بذارم

میلاد قاضی پور
دوشنبه 12 مهر 1389, 21:43 عصر
اوج بلند عزیز
من فقط کانکشن رو تو using نوشتم ارور داد(بعدش میگفت con نداریم)
مجبورشدم همررو توی{} بذارم
متوجه نشدم . من نمیگم جور دیگه ای بنویسید منم میگم گفته شماها هم درسته اما میگم اینکه گفتم یوزینگ با آکولاده به خاطر این بود که فکر کردم اونی که تو پرانتز نوشتید دستوره . در کل هردومون ناقص نوشتیم آقای موسوی درستش کرد .

aghayex
دوشنبه 12 مهر 1389, 21:49 عصر
این اعداد و ارقام رو از کجا آورده اید؟ حتی اگر واحد رو اشتباه هم ذکر کرده باشید، چنین سقفی برای برنامه ها در ویندوز وجود نداره. (Firefox رو بطور نمونه باز کنید و ببینید چقدر حافظه به خودش اختصاص میده).

این عدد رو در windows task manager تو تب processes می گم

mehdi.mousavi
دوشنبه 12 مهر 1389, 22:07 عصر
خوب این سوال می مونه پس چرا برنامه ای که من می نویسم فضای اشغالی که از رم می گیره تا 60 کیلوبایت می ره اما بزرگترین برنامه که در ویندوز کار می کنه از 25 کیلو بایت بالا نمیاد. این عدد رو در windows task manager تو تب processes می گم

سلام.
25KB یا 60KB نیست، 25,000KB یا 60,000KB هستش، که میشه 25MB، 60MB....
در هر حال، پاسخ همونی هستش که خدمتتون عرض کردم. در کل، همونطور که گفتم، واحدش اهمیتی نداره، این بستگی به نرم افزارها و Resource های سیستمی داره که هر برنامه چقدر حافظه مصرف کنه. در نهایت، شما باید با Garbage Collector و مکانیزمهای مورد استفاده اون برای مدیریت حافظه آشنا بشید که لینکی که بهتون دادم (http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/)، این اطلاعات رو بهتون میده.

موفق باشید.