PDA

View Full Version : نوع های IEnumerable, IQueryable ؟



ramin_rp
یک شنبه 15 مرداد 1391, 13:08 عصر
سلام
دوستان بعضی توابعی رو دیدم که نوع بازگشتی شون IEnumerable, IQueryable هست
همچنین تو linq هم برای نوع داده بازگشتی query در نظر گرفته میشن


IEnumerable<int> query = from x in y

تا جایی که من میدونم اینها اینترفیس هستن msdn رو هم دیدم ولی باز نفهمیدم اینا چطور به عنوان نوع داده
استفاده شدند.

لطفا توضیح دهید یا مرجعی برای مطالعه معرفی فرمایید.

مهرداد صفا
یک شنبه 15 مرداد 1391, 14:28 عصر
سلام طاعات قبول!
در کل یک interface میتواند به عنوان نوع داده در نظر گرفته شود که در این حالت تمام اشیا که از این این interface در ساختمان استفاده کرده باشند میتوانند در این داده قرار گیرند. شما میتوانید متودهای بسیاری را در .net ببینید که آرگومنتهای به صورت interface میگیرند. به این کد دقت کنید:

IDisposable d;
d = new Form();

(d as Form).Show();
(d as Form).Text = "form2";

حالا اگر d را مثلا ICloneable تعریف میکردیم با خطا مواجه میشدیم چرا که Form از IDisposable استفاده کرده و d با تمام کلاسهایی که از این interface ساخته شده باشند سازگار است.

gwbasic
یک شنبه 15 مرداد 1391, 14:43 عصر
این دو به صورت ساده لیست از اشیاء هستند فقط دو نکته خیلی مهم دارند IEnumerable این امکان Differed Execution یعنی اجرای به تعویق افتاده رو می ده که در LINQ بسیار موضوع مهمی هست و IQueryable جدای از این مطلب امکانی رو می ده که کوئری نوشته شده قابلیت تفسیر به مثلا دستور SQL رو داشته باشه البته IQueryable فقط این امکان رو می ده و این کار یک پروادر مثل LINQ TO SQL و Entity Framework هست که کار تقسیر رو انجام می ده. برای توضیحات بیشتر کافیه مثال های IEnumerable رو از msdn و یا هر جای دیگری ببینید

ramin_rp
یک شنبه 15 مرداد 1391, 15:21 عصر
طبق گفته دوستمون M.safa (http://barnamenevis.org/member.php?261217-M.safa) اگه استفاده از اینترفیس به عنوان نوع داده به معنی قرار گرفتن آبجکتی از هر کلاس که اون اینترفیس رو پیاده کرده باشه
در اون صورت امکان هایی ماننده Differed Execution و یا تفسیر به sql مربوط به توابع اینترفیس هست؟

gwbasic
یک شنبه 15 مرداد 1391, 16:30 عصر
طبق گفته دوستمون M.safa (http://barnamenevis.org/member.php?261217-M.safa) اگه استفاده از اینترفیس به عنوان نوع داده به معنی قرار گرفتن آبجکتی از هر کلاس که اون اینترفیس رو پیاده کرده باشه
در اون صورت امکان هایی ماننده Differed Execution و یا تفسیر به sql مربوط به توابع اینترفیس هست؟

اینترفیس تنها یک قرارداد هست وبس. هیچ کار دیگری از اینترفیس بر نمی آید. برای اینکه DE رو بهتر متوجه بشید نحوه تعریف یک متد رو که خروجی IEnumerable<T> دارد رو بررسی کنید و در مورد دومی هم عرض کردم این امکان رو ایجاد می کنه با استفاده از ساختاری که IQueryable داره وگرنه کار تفسیر توسط پروایدر انجام می شه