PDA

View Full Version : سوال: تفاوت List - Table - IEnumerable ؟



rahe behtari hast
شنبه 11 آذر 1391, 11:53 صبح
دوستان من توي تاپيكي با عنوان "درك بهتر مفهوم متغييرها" به چيزي كه ميخواستم رسيدم
الان فكر ميكنم درك درستي از متغيير، نمونه گيري از كلاس، آبجكت و آرايه و ليست دارم

اما هنوز يك سوال باقي مونده

تفاوت Lsit-Table-IEnumerable ؟

nunegandom
شنبه 11 آذر 1391, 12:26 عصر
سلام، طبق این دو منبع که نصفه نیمه یه چیزایی دستگیرم شد:
http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list
http://stackoverflow.com/questions/4180767/whats-the-difference-between-liststring-and-ienumerablestring
ذات List کلاسه IEnumerable هستش. IEnumerable صرفا یک دنباله هستش، اما List الیندکس میشه و در ایندکس های خاص چیزی رو تغییر داد(منظور ایندکس ۳۰ رو مقدار بدی، بعد بری ۳۵ مثلا)
IEnumerable اجازه دسترسی به صورت رندوم رو نمیده، یعنی نمیتونی هر آیتمی دلت خواست رو دست بزنی!
(؟)مقدار هر خونه ی IEnumerable ثابت هست ولی List متغییر (Variable)
نظر شخصی:
IEnumerable منسوخ شده!
ممنون به خاطر سوال :)

rahe behtari hast
شنبه 11 آذر 1391, 13:20 عصر
ذات List کلاسه IEnumerable هستش.

ممنون بخاطر جواب

***خب ببينيد من هنوز List رو درست نميفهمم
ليست يك كلاس هست.

خب پس چرا وقتي ما مثلا ميخوايم از كلاس button يك نمونه بگيريم اين كار رو ميكنيم:

button button1 = new button();

اما براي نمونه گرفتن از كلاس ليست اين دو راه وجود داره

List<int> list1 = new List<int>();
List<int> list1;

تفاوت ديگه اي هم كه با بقيه كلاسها داره اينه كه بقيه كلاسها ظاهرشون ثابته مثلا شما فقط ميتونيد از Button به همين شكل نمونه گيري كنيد
اما ليست فرق داره ميتونيد از List<int>a نمونه بگيريد يا ميتونيد List<class>a نمونه بگيريد. اين چه مدل كلاسيه؟

من هنوز مطمئن نيستم list يك كلاس باشه
اين چيزيه كه من تا اينجا قبول دارم

1) ما int string... رو داريم كه نوع هستند
2) دو تا ابزار داريم براي چسبوندن متغييرها به همديگه كه array و list هستن
"اين دو قسمت با كمك هم متغيير ايجاد ميكنن"

3)دست آخر يك عالمه كلاس داريم كه با نمونه گيري ازشون در حقيقت objectي ساخته ميشه كه خوده اون آبجكت در حقيقت يك سري متغيير هست.

يعني list كلاس نيست.

*** در مورد table صحبتي نشد.

hakim22
شنبه 11 آذر 1391, 14:47 عصر
در برنامه نویسی شی گرا همه چیز شی ( کلاس) است و نه چیزی غیر از آن و بحث اینه که شما شی ها رو درست درک نکرده اید.

در کد زیر :

List<int> list1 = new List<int>();
List<int> list1;



خط اول و دوم هر دو تعریف کلاس هستند. اما در خط اول همه ی سطرهای لیست با یک مقدار پیشفرض مقدار دهی شده اند اما در سط دوم کلاسی که تعریف شده هنوز پوچ null است و اگر شما سعی کنید یکی از خانه های ( یا سطرها یا همان آیتم های آن ) را برگردانید خطای Null Refrence Exception رو دریافت می کنید.

دقت کنید که Button یک کلاسی است که برای ساختنش ( Constructor) نیاز به هیچ پارامتر پیشفرضی یا مقدار اولیه ندارید. و فقط با یک New و اسم کلاس میتوانید آن را نمونه سازی کنید.

اما خیلی از کلاسها برای ساخته شدن نیاز به یک مقدار اولیه دارند مثل FileInfo در System.IO شما برای ساختن این کلاس حتما باید یک مقدار رشته ای که نشان دهنده ی آدرس فایل است ارائه کنید

system.io.fileinfo myfi=new system.io.fileinfo("d:\test.txt");


در مورد لیست ها برای اینکه مشخص باشه مقدار ورودی حتما باید یک type باشه (کلاس) از عملگر <> استفاده شده تا تمایز داشته باشه با آرگومان های معمولی در هر صورت generic ها در دات نت بعدا تعریف شده اند و یکی از قابلیت های جدید این زبان هستند که از استاندارهای معمول پیروی نمی کنند مانند LINQ

rahe behtari hast
شنبه 11 آذر 1391, 15:33 عصر
در کد زیر :

List<int> list1 = new List<int>();
List<int> list1;

خط اول و دوم هر دو تعریف کلاس هستند. اما در خط اول همه ی سطرهای لیست با یک مقدار پیشفرض مقدار دهی شده اند اما در سط دوم کلاسی که تعریف شده هنوز پوچ null است و اگر شما سعی کنید یکی از خانه های ( یا سطرها یا همان آیتم های آن ) را برگردانید خطای Null Refrence Exception رو دریافت می کنید.


خب مهندس اوضاع داره يكم بهتر ميشه

*** اين حرف درسته؟

Class x;a
x = new Class();a
X = value;a

1) يك آبجكت از يك كلاس ايجاد ميكنيم
2) براي اون آبجكت فضايي از حافظه رو در نظر ميگيريم
3) در اون فضا اطلاعات ميريزيم

*** دليل اين كه بعد از آبجكت گرفتن از كلاس int عمليات new را انجام نميديم چيه؟

*** يك چيزي هم راجع به table<>a بگيد. فرقش با ليست چيه؟

hakim22
شنبه 11 آذر 1391, 15:43 عصر
int هم همیشه نیاز به استفاده از دستور new داره ولی در شما معمولا مقدارش رو مستقیما پر می کنید :

int a =10

فرقی با این نداه :

int a =new int
a=10