12. as Operator

[נכתב ע”י שני אלחרר]

והטיפ היומי הוא בנושא המרות (Casts).

לפעמים אנחנו לא מודעים לסוג של אובייקט, אז אנחנו עושים Castים כך:

1
2
3
4
5
6
7
8
9
10
11
object obj = GimmeObject();
try
{
int initifiedObj = (int) obj;
// Object is int, continue...
}
catch (InvalidCastException)
{
// Object is not int
}

השיטה הזו לא נכונה, כיוון שזה לא נכון להשתמש בExceptionים לFlow הרציף של התוכנה.

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

is יחזיר ערך חיובי אם האובייקט יורש/הוא מהType שניתן, as יחזיר את האובייקט מומר לType שניתן אם הוא יורש ממנו / הוא מהType שניתן – ואם לא, הוא יחזיר את הערך null.

דוגמה לשימוש בis, בדיקה שאובייקט יורש מIDisposable :

1
2
3
4
5
6
object obj = GimmeObject();
if (obj is IDisposable)
{
Console.WriteLine("Object is disposable")
}

דוגמה לשימוש בas, קריאה לDispose של אוסף אובייקטים שחלקם יורשים וחלקם לא מIDisposable :

1
2
3
4
5
6
7
8
9
10
11
IEnumerable<object> objects = GimmeObjects();
foreach (object obj in objects)
{
IDisposable disposable = obj as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}

שימו לב כי כתיבת השורה

1
MyClass myClassObj = obj as MyClass;

שקולה לכתיבת השורות הבאות:

1
2
3
4
5
6
7
8
9
10
MyClass myClassObj;
if (obj is MyClass)
{
myClassObj = (MyClass)obj;
}
else
{
myClassObj = null;
}

ולכן לא ניתן להשתמש באופרטור as בשביל ValueTypes (כגון int, DateTime וכו’)

ראו גם טיפים 326-328 להבדלים בין is וas.

שתף