47. System Action

בהמשך לטיפ היומי של אתמול,

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

לכן המציאו את Action (נמצאים בSystem.Core.dll בnamespace ששמו system, פרט לAction שנמצא בmscorlib 😃)

1
2
3
4
5
public delegate void Action();
public delegate void Action<T>(T obj);
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

לדוגמה מהדוגמאות שראינו ביום חמישי:

1
2
3
4
public delegate void PrintDelegate(string output);
PrintDelegate printDelegate =
x => Console.WriteLine(x);

במקום נוכל להשתמש בAction:

1
2
Action<string> printDelegate =
x => Console.WriteLine(x);

גם זה חוסך לנו הרבה delegateים מיותרים ומגעילים.


באופן כללי בבואכם לכתוב delegateים משלכם חשבו על הנקודות הבאות:

  1. האם קיים delegate כזה כבר (לרבות Func וAction)
  2. אם לא, אולי אני עושה משהו לא בסדר (אולי אני מקבל יותר מדי פרמטרים, אולי זה לא נכון שאני מקבל פרמטרים מסוג params/ref/out)
  3. במידה ועברתם את שלב 2, חשבו אם אפשר להשתמש בGenerics כדי לאפשר Reuse לdelegate שלכם ולא להשתמש בו באופן חד פעמי
  4. זכרו שקיימים covariance וcontravariance ברמת השפה בין delegateים וmethod groups, כך שdelegate פחות/יותר ספציפי יכול לשמש יותר method groups ממה שנראה לעין.

המשך יום טוב

שתף