PDA

View Full Version : چرا باید در هر بار استفاده از کلاس شی آن نیو بشه؟



man_iran
پنج شنبه 18 تیر 1388, 10:10 صبح
سلام
چرا وقتی می خواهیم چند متد از یک کلاس را فراخوانی کنیم برای هر بار فراخوانی باید شی آن کلاس را نیو کرد!!؟
مثلا اگر در یک باتون چند متد را فراخوانی کنیم (از یک کلاس طراحی شده توسط خود برنامه نویس) باید قبل از هر بار فراخوانی شی آن کلاس نیو بشه! چرا ؟

Open-Source
پنج شنبه 18 تیر 1388, 10:43 صبح
شما میتونید این کار رو در اون بالا انجام بدید و در کل برنامه استفاده کنی.

بعد این جور کد نویسی یکی از ویژگی های سی شارپ هستش ، آخه یه جور نظم وانسجام به برنامه میدهد و مانع از سر در گمی میشود(این نظر من بود).

hozouri
پنج شنبه 18 تیر 1388, 10:48 صبح
چون باید یک نمونه از شیء از آن ساخته شود و در حافظه heap که این حافظه مربوط به انواع ارجاعی هستند قرار گیرید.

برای دسترسی فیلد ها , متد ها و ... یک کلاس بدون کلمه کلیدی New می توانید از کلمه کلیدی static در تعریف فیلدها , متدها و ... استفاده کنید که توجه داشته باشید فیلدهای Static در بین همه اشیای ساخته شده در آن کلاس یکی است و اگر مقادیر فیلد static را تغییر دهید در بین تمام نمونه های کلاس این تغییر مشاهده می شود.

man_iran
پنج شنبه 18 تیر 1388, 10:48 صبح
شما میتونید این کار رو در اون بالا انجام بدید و در کل برنامه استفاده کنی.

بعد این جور کد نویسی یکی از ویژگی های سی شارپ هستش ، آخه یه جور نظم وانسجام به برنامه میدهد و مانع از سر در گمی میشود(این نظر من بود).

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

hozouri
پنج شنبه 18 تیر 1388, 10:58 صبح
ببنید خیلی واضح عرض کنم که کلمه کلیدی New بیانگر این است که شیء جدید در حافظه heap قرار گیرند اگر شما می خواید اون رو با متغیر ها مقایسه کنید این 2 کاملاً متفاوت هستند متغیرها , Enum ها , Struct و ... از نوع مقداری هستند ولی کلاس ها از نوع ارجاعی هستند برای درک بهتر شما می تونید به مقاله های انواع داده ها در دات نت مراجعه فرمایید.

mzalireza
پنج شنبه 18 تیر 1388, 18:12 عصر
ببینید لزومی نداره که همه متدهاتون رو توسط شیئ کلاس فراخونی کنید، اگه متدهای شما مانند متدهای کلاس Math بصورت static تعریف شده باشن، تنها کافیه که برای فراخوانی اونها از نام خود کلاس (در اینجا Math ) استفاده کنید، مثل:

Math.Sqrt(4)اتفاقاً بهتره که حدالمقدور متدها بصورت static تعریف بشن. مثلاً اگه متد Sqrt در کلاس Math بصورت static تعریف نشده بود، مجبور بودیم برای فراخونی متد Sqrt ابتدا یک شیئ از کلاس Math بسازیم:
Math m = new Math();
double d = m.Sqrt(4)این روش چندان کارآمد نیست. چون شیئ m هیچ نقشی در محاسبه Sqrt بازی نمیکند، در حقیقت Sqrt یک تابع خالص می باشد.

یه مثال دیگه:
فرض کنید میخواهیم مدت زمان محاسبات مربوط به یک عملیات ریاضی را بدست آوریم، باید از توابع کلاس Stopwatch استفاده کنیم.
اکنون فرض کنید شما میخواهید مدت زمان محاسبات 2 قسمت را بدست آورید، (بیش از یکی) دراینصورت مجبورید از 2 شیء استفاده کنید، یعنی 2تا Stopwatch. مثل اینه که شما میخواهید در دنیای واقعی مدت زمان 2 آزمایش علمی رو اندازه بگیرید که دارند همزمان انجام میشن و شما تنها یک ساعت مچی دارید مجبورید به یک ساعتفروشی مراجعه کنید و یک ساعت مچی دیگه بخرید، در واقع شما با ساختن یک Stopwatch دارید اون رو میسازید یا میخرید البته مجانی!
و با این 2تا ساعت که دستتون هست (Watch_1 و Watch_2) میتونید 2تا زمان رو اندازه بگیرید و حتی به هرتعدادی که میخواید میتونید ساعت بسازید و از اونها استفاده کنید.


Stopwatch Watch_1 = new Stopwatch();
Watch_1.Start();
// Your code
Watch_1.Stop();
elapsedTime_1.Text = Watch_1.ElapsedMilliseconds.ToString() ;

Stopwatch Watch_2 = new Stopwatch();
Watch_2.Start();
// Your code
Watch_2.Stop();
elapsedTime_2.Text = Watch_2.ElapsedMilliseconds.ToString() ;


امیدوارم با این توضیحات بنده به فلسفه ایجاد برنامه نویسی شیئ گرا و رابطه اون با دنیای واقعی هم پی برده باشید که چرا دنیای برنامه نویسی داره از برنامه نویسی روال گرایی به سمت شیئ گرایی حرکت میکنه.

Mahdi.Kiani
پنج شنبه 18 تیر 1388, 20:34 عصر
ولی کلاس ها , Struct ها از نوع ارجاعی هستند برای درک بهتر شما می تونید به مقاله های انواع داده ها در دات نت مراجعه فرمایید.
سلام دوست عزیز
Structue ها Value Type هستند./
توضیحات کاملتر (http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx)
موفق باشید./

hozouri
شنبه 20 تیر 1388, 15:21 عصر
ممنونم از راهنماییتان من این رو می دونستم اشتباهی بود که در نوشتن انجام داده بودم.
باز هم از یادآوری شما خیلی متشکر هستم.