308. Array Indexer

הזכרתי את זה בקטנה פעם הקודמת, אבל מאחר וגיליתי שלא כולם מכירים את זה, נראה לי שזה שווה את הטיפ.

כשאנחנו עובדים עם מערכים נורמליים (כאלה שנוצרים באמצעות האופרטור new ולא בדרכים ביזאריות אחרות), יש לנו שתי אופציות לגשת לתא מסוים:

הדרך הראשונה היא באמצעות הפונקציות GetValue וSetValue של המחלקה האבסטרקטית Array ממנה יורשים כל המערכים:

(ChessPiece הוא איזשהו enum)

1
2
3
ChessPiece[,] board = new ChessPiece[8,8];
board.SetValue(ChessPiece.Pawn, 1, 0);
ChessPiece king = (ChessPiece)board.GetValue(0, 4);

יש לזה יתרון, כי זה מאפשר לגשת לתא ידוע של מערך בגודל לא ידוע מטיפוס לא ידוע.

מצד שני, זה לא Typed-safe.

בנוסף, יש פה Boxing, מאחר והפונקציות האלה מקבלות ומחזירות object.

מה שנחמד במערכים, זה שלכל מערך יש Indexer שהוא Typed-safe. אפשר להשתמש בו כך:

1
2
3
ChessPiece[,] board = new ChessPiece[8,8];
board[1, 0] = ChessPiece.Pawn;
ChessPiece king = board[0, 4];

שימו לב שבניגוד לדוגמה הקודמת, הדוגמה הזאת קורית בלי Boxing!

כדאי לשים לב שלמערכים יש את הפריבילגיה ליצור Indexer כזה שמתבסס על הגודל. למעשה, לכל מערך בגודל כלשהו קבוע הידוע בזמן קימפול, יש את הIndexer הזה, למשל:

1
2
3
int[,,,,,,,,,] tensor = new int[1,2,3,4,5,6,7,8,9,10];
tensor[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] = 42;
int fourtyTwo = tensor[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

במחלקה גנרית משלנו אי אפשר לעשות משהו כזה – אם היינו מממשים בעצמנו מערך, לא היינו יכולים להנות מFeature כזה.

המשך יום מאונדקס לטובה!

שתף