328. About as and is+cast - part 3

בהמשך לפעמים הקודמות: ראינו את היתרונות של קוד כזה:

1
Shape shape = obj as Shape;

על הקוד הזה:

1
2
3
4
5
6
Shape shape = null;
if (obj is Shape)
{
shape = (Shape) obj;
}

למרבה הצער, הדבר הזה לא כל כך עובד אם במקום Shape נשים Value Type, מאחר וValue Type אינו יכול לקבל ערך null.

עם זאת, היינו רוצים להנות מהיתרונות של הקוד הנ"ל גם עבור Value Types.

מה שאנחנו יכולים לעשות במקום זה את הטריק הבא:

1
2
3
4
5
long? number = obj as long?;
if (number != null)
{
// ...
}

אנחנו משתמשים בNullable שנוכל להשתמש באופרטור as, ובמידה ואנחנו מצליחים, אנחנו נקבל גם את הערך האמיתי של האובייקט מוסב לטיפוס המתאים.

אם נסתכל בIL שנוצר, נראה את הקוד שראינו כבר:

1
2
3
4
L_0003: ldloc.0
L_0004: isinst [mscorlib]System.Nullable`1
L_0009: unbox.any [mscorlib]System.Nullable`1
L_000e: stloc.1

אנחנו רואים שבעצם מדובר בקוד שכבר ראינו, רק שיש פה גם Unboxing.

מסתבר אגב, שהקוד הזה פחות יעיל מהקוד השקול:

1
2
3
4
if (obj is long)
{
number = (long) obj;
}

הערה: הסדרה מבוססת על השאלה הבאה בStackOverflow.

המשך יום מוסב לטובה!

שתף