PDA

View Full Version : سوال: Object در مقابل Generic



irpersian20
دوشنبه 27 مرداد 1393, 12:47 عصر
سلام،
وقتی میشه از object استفاده کرد. دیگه را generic ها؟

plus
دوشنبه 27 مرداد 1393, 13:51 عصر
خوب دلایل مختلفی هست:
1.یکی از اونها این هست که عملیات boxing/unboxing (تبدیل یک شی نوع object و تبدیل نوع object به اون شی) زمان بر هست.
برای مثال، نسخه های اولیه NET.، برای تعریف یک لیست که امکان Insert/Remove و ... داشته باشه، کلاس ArrayList تعریف شده.این کلاس لیستی از object ها رو نگه داری میکنه.
خوب حالا شما اگه میخواستی لیستی از متغیرهای نوع int رو تعریف کنی و باهاش کار کنی، به این صورت عمل میکردی:

ArrayList list = new ArrayList();
list.Add(10);
list.Add(11);
// ...
// ...
int firstItem = (int)list[0];

ازون جایی که این لیست، فقط آیتم های از نوع object رو میگیره، شما شما متغیرها یا مقادیر عددی بهش میدی، این مقادیر باید اول به object تبدیل بشن و به این کلاس ارسال بشن.این عمل تبدیل رو میگن Boxing.در واقع مقدار int مورد نظر در یک مقدار object بسته بندی شده.
حالا زمانی که میخوای مقدار رو دریافت کنی، لیست، مقادیر رو به صورت object در اختیارت میگذاره و نه عددی.بنابراین شما باید اون object رو به int تبدیل کنید (با Explicit cast). به این عمل Unboxing گفته میشه.در واقع مقدار int رو از داخل بسته object درمیارین.
این فرآیند boxing/unboxing که در پشت صحنه انجام میشه زمان بر هست ویکی از ایرادات استفاده از object بجای Generic ها.
در نسخه ی بعدی NET. کلاس <List<T معرفی میشه که همون عملیات ArrayList رو اینبار به صورت Generic پیاده میکنه. شما اگه بخوای عمل بالا رو با این کلاس انجام بدی به این صورت میشه:


List<int> list = new List<int>();
list.Add(10);
list.Add(11);
// ...
// ...
int firstItem = list[0];

همونطور که میبنید اینجا دیگه boxing/unboxing وجود نداره.متد Add شی از نوع int میگیره و عملگر [] هم مقدار از نوع int برمیگردونه و نیازی به cast نیست.

2. دلیل دوم، کاهش خطا و بررسی Compile Time نوع ها بجای بررسی Runtime هست.
توی مثال بالا مورد اول اگه شما اشتباها به ArrayList یک شی String بجای شی int اضافه کنی، خطای Compile Time ی ایجاد نمیشه چون از دید Compiler کد شما صحیح هست، متد Add شی object میگیره.در حالی که زمان اجرا وقتی شما در لیست یک عدد int انتظار داری و اون رو میخوای به int تبدیل کنی، با خطای Runtime مواجه میشی.
ولی توی مورد دوم، یک چنین کدی، زمان Compile خطا میده چون متد Add انتظار مقدار int رو داره.طبیعتا پیدا شدن خطا زمان Compile بهتر از پیدا شدنش در Runtime هست.

احتمالا دلایل مهم دیگه ای هم هست که هرچی بیشتر با Generic ها کار کنید و در موردش مطالعه کنید باهاشون بیشتر آشنا میشید.