ورود

نسخه کامل مشاهده نسخه کامل : استفاده از یک کلاس بدون گرفتن حافظه



iranch
13-07-2014, 00:18
درووود - مگر ما نباید وقتی میخواهیم از کلاسی استفاده کنیم باید ابتدا شی از ان بسازیم؟


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


کد بالا ما داخل Customer یک متغیر از نوع کلاس Car تعریف کردیم که هنگام استفاده فقط وقتی از کلاس Customer شی تعریف کنیم کافی هست و به راحتی بدون new کردم از Car میشه ازش استفاده کرد و مقدار دهی کرد کلاس car رو.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و سوال بعدی اینکه متغیر از نوع کلاس
Car رو به صورت Property تعریف کرده- اگر Property نمیزاشت چه فرقی میکرد؟
بعد چطور میشه به طور مستقیم از set استفاده کرد؟ یا get ? کدام از متغیر ها رو برمیگردونه یا ست میکنه؟ تست کردم ارور میداد.

L͠øneWolf
13-07-2014, 01:36
car یه Property هست. Property ها متغیر نیستن، بلکه یه پک از دو تا تابع (Setter and Getter) هستن.
به خاطر همین معمولا جاهایی که Property تعریف می شه یه متغیر (Field) هم کنارش تعریف می شه.


مثل



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


یه نوع خاص از Property رو داریم به اسم Automatic Property که متغیرشو خود کامپایلر می سازه (به صورت مخفیانه)


کد زیر، معادل کد بالاست (متغیرهاش به صورت مخفی تعریف می شه)



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



و سوال بعدی اینکه متغیر از نوع کلاس
Car رو به صورت Property تعریف کرده- اگر Property نمیزاشت چه فرقی میکرد؟
بعد چطور میشه به طور مستقیم از set استفاده کرد؟ یا get ? کدام از متغیر ها رو برمیگردونه یا ست میکنه؟ تست کردم ارور میداد.
Property مزیت های خیلی زیادی نسبت به متغیر داره.

Property داده داخل شیء رو از کاربر مخفی نگه می داره. (ویژگی کپسوله‌سازی)
Property قابلیت کنترل مقادیر رو هنگام مقداردهی فراهم می کنه. (قابلیت صحت سنجی)
Property قابلیت استفاده از Databinding رو داره، اما متغیر چنین قابلیتی رو نداره.

و و و


بعد چطور میشه به طور مستقیم از set استفاده کرد؟ یا get ? کدام از متغیر ها رو برمیگردونه یا ست میکنه؟ تست کردم ارور میداد.
Property ها مثل متغیر های معمولی استفاده می شن. موقع استفاده کامپایلر به صورت خودکار توابع Setter و Getter رو فراخوانی می کنه.

iranch
13-07-2014, 08:25
سپاس گزارم از پاسخت اما نکته مبهم هنوز پابرجاست هست و اون اینه که بدون اینکه از کلاس Car ما چیزی new کنیم به راحتی ازش استفاده کردیم!! هنوز حافظه براش نگرفتایم. برای Customer حافظه گرفتیم اما برای Car هم انگار گرفته شده!

در مورد Property ها هم درست می فرمائید اما اینجا که Property کارایی چی هست؟ چون نمیتونیم مستقیم که set یا get رو ازش فراخوانی کنیم. با حتما فیلد رو صراحتا ذکر کنیم.

L͠øneWolf
13-07-2014, 14:49
سپاس گزارم از پاسخت اما نکته مبهم هنوز پابرجاست هست و اون اینه که بدون اینکه از کلاس Car ما چیزی new کنیم به راحتی ازش استفاده کردیم!! هنوز حافظه براش نگرفتایم. برای Customer حافظه گرفتیم اما برای Car هم انگار گرفته شده!
چون از Automatic Property استفاده کردیم، خود کامپایلر به صورت خوکار متغیر رو تعریف می کنه و باید برای استفاده خودمون بهش حافظه اختصاص بدیم. اگه از Property معمولی استفاده کرده بودیم، خودمون باید یه متغیر Private تعریف می کردیم و براش حافظه می گرفتیم.



در مورد Property ها هم درست می فرمائید اما اینجا که Property کارایی چی هست؟ چون نمیتونیم مستقیم که set یا get رو ازش فراخوانی کنیم. با حتما فیلد رو صراحتا ذکر کنیم.
Property حالت استاندارد استفاده از Filed هست. چون قابلیت کپسوله سازی ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ](object-oriented_programming)) رو برای ما فراهم می کنه (علاوه بر مزیت های زیاد دیگه ای که داره). از نظر شکل استفاده تفاوتی ندارن. اما بهتره همیشه از Property استفاده بشه.


وقتی به جای Field از Automatic Property استفاده می کنیم هم خیالمون راحته که بعدا اگه لازم شد از توابع Setter و Getter استفاده کنیم، لازم نیست رابط کلاسمون رو تغییر بدیم و فقط پیاده سازیش رو تغییر می دیم...

_H2_
13-07-2014, 21:22
سلام
ضمن موافقت با پست های اول و دوم و سوم باید عرض کنم...
کدهای پست اول این تاپیک بدون شک موقع اجرا خطای NullReferenceException خواهند داد، کافی است امتحان کنید.؟؟؟!!!
منطق روشن است شی car نمونه سازی و new نشده پس قابل استفاده نیست. باید قبل از استفاده new شود.
کد ایراد داشته و اجرا نخواهد شد، مگر انکه Car یک struct باشد یا در جایی new شود.

L͠øneWolf
13-07-2014, 22:33
سلام
ضمن موافقت با پست های اول و دوم و سوم باید عرض کنم...
کدهای پست اول این تاپیک بدون شک موقع اجرا خطای NullReferenceException خواهند داد، کافی است امتحان کنید.؟؟؟!!!
منطق روشن است شی car نمونه سازی و new نشده پس قابل استفاده نیست. باید قبل از استفاده new شود.
کد ایراد داشته و اجرا نخواهد شد، مگر انکه Car یک struct باشد یا در جایی new شود.
درسته دقت نکرده بودم. مرسی.
منم ویرایش کردم.