例でこの質問を紹介しましょう:イベントの 'source'のネストされたオブジェクトポインタを使用するのは正しいですか?
私たちはUserNotificationクラスを持っています。通知に関する情報、ユーザーオプションの可能性があります。
public class UserNotification
{
// Event fired on notification broadcast
public event EventHandler<NotifyEventArgs> Notification;
public string Title { get; set; }
public string Description { get; set; }
public List<NotificationResults> Options { get; set; }
// ...
// This function is called to raise notification
public void Notify()
{
if (Notification != null) Notification(null, new NotifyEventArgs());
}
}
私たちにはたくさんの通知があります。プログラムのいくつかの部分が(ユーザーのために)通知を発生させる必要があるたびに、通知オブジェクトを取り、Notify()メソッドを呼び出します。通知イベントが発生し、すべてのリスナーがこの通知を処理します(gui、showダイアログボックスなどのどこかに表示してください)。そして通知リスナーは、おそらく、それらをすべてリストすることが大好きです。したがって、次に注目すべきことは、NotificationManagerです。これは、登録された通知のいずれかがその通知イベントが発生したときに
public class NotificationManager
{
public event EventHandler NotificationRaised;
private List<UserNotification> _notifications;
public void AddNotification(UserNotification notification)
{
_notifications.Add(notification);
notification.Notification +=() =>
{
if (NotificationRaised != null) NotificationRaised(???, ???)
};
}
そして、ここで質問が来て解雇されUserNotificationとNotificationRaisedイベントのコレクションを持っています。 NotificationRaised(???、someEventArgs)を見てください。この時点で、ソース通知へのポインタを渡す必要があります。これにより、リスナーはこの特定の通知を処理できます。 NotificationManagerのイベントハンドラには、必要なものと正確に見える 'source'フィールドがあります。質問は次のとおりです。
通知ポインタをソースとして指定しても問題ありませんか?または設計といくつかの良い理由によって、ソースは、がイベントを発生させているオブジェクトである必要がありますか?
つまり、この例を見ると、「意図した動作として」ですか?
私は、あまりにも!しかし、私はそれが悪いいくつかのケースがあるかもしれないと思った。または制限。この場合に再生できる.Net標準ライブラリのいくつかの「隠された機能」。または、これを行うことは、「意図したとおりには動作しない」という結果になるかもしれないと言います。 – MajesticRa
@MajesticRa:助けがあれば、何も問題なく前にこれをやったことがあります。 –
ありがとうございます!誰もその主題の悪い面を証明しているわけではないので、経験豊富な開発者の意見を聞くことは本当に良いことです。 – MajesticRa