ראינו בעבר הרחוק (טיפ מספר 4) שניתן לעטוף IListב ReadOnlyCollection כדי שלא יוכלו לשנות אותו.
נניח שיש לנו איזשהו IEnumerable
אופציה אחת היא להחזיר אותו מהפונקציה עם טיפוסIEnumerable
נניח שנחזיר את הCollection כך:
|
|
אלא שאפשר להתחכם איתנו:
|
|
מה אפשר לעשות?
אופציה אחת היא לעטוף אותו בReadOnlyCollection. הבעיה היא שReadOnlyCollection יודע לעבוד רק מולIList.
אופציה אחרת היא טיפה יותר יצירתית: נחזיר טיפוס אחר:
אפשר לעשות את זה בשתי דרכים: הדרך הנאיבית היא ליצור מחלקת Wrapper:
|
|
ואז להחזיר ככה:
|
|
אופציה שנייה היא יותר יצירתית והיא נראית ככה:
|
|
מה קורה כאן? מצד אחד זה נראה כאילו לא קרה כלום. מצד שני, מה שקורה כאן זה שמוחזר IEnumerable<int> עם טיפוס אחר.
הקסם בדרך הזאת היא שגם אם אחר כך יעדכנו את mTheNumbers, יעודכן גם הIEnumerable<int> שחוזר מהפונקציה. וזאת למה? כי המתודות של LINQ הן Lazy – כלומר הן מחושבות רק כאשר אנחנו מתחילים לרוץ על הEnumerable! (ראו גם טיפים מספר 90,91)
בכל אופן, לדעתי זו דרך מאוד מעניינת ושווה להשקיע בלהבין למה היא עובדת…
סוף שבוע שלא ניתן לקריאה בלבד טוב!