c#与ts事件
# TypeScript 事件示例
在 TypeScript 中,我们通常使用观察者模式来实现事件机制。下面是一个简单的示例:
// 定义事件类型
interface Observer {
update: (data: any) => void;
}
// 定义主题类
class Subject {
private observers: Observer[] = [];
addObserver(observer: Observer) {
this.observers.push(observer);
}
removeObserver(observer: Observer) {
this.observers = this.observers.filter(o => o !== observer);
}
notify(data: any) {
this.observers.forEach(observer => observer.update(data));
}
}
// 创建主题实例
const subject = new Subject();
// 定义观察者
const observer1 = {
update: (data: any) => console.log(`Observer 1 received: ${data}`)
};
const observer2 = {
update: (data: any) => console.log(`Observer 2 received: ${data}`)
};
// 添加观察者
subject.addObserver(observer1);
subject.addObserver(observer2);
// 触发事件
subject.notify('Hello, world!');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
在这个示例中,我们定义了一个 Subject 类作为事件源,它维护了一个观察者列表。观察者需要实现 Observer 接口中的 update 方法。当事件被触发时,Subject 会遍历观察者列表并调用它们的 update 方法。
# C# 事件示例
在 C# 中,事件是一种语言级别的构造,用于实现发布者-订阅者模式。下面是一个简单的示例:
using System;
// 定义事件处理器委托
public delegate void EventHandler(object sender, EventArgs args);
// 定义事件源类
public class EventSource
{
// 定义事件
public event EventHandler MyEvent;
// 触发事件
public void RaiseEvent()
{
if (MyEvent != null)
{
MyEvent(this, EventArgs.Empty);
}
}
}
// 定义事件处理程序
public class EventHandler1
{
public void HandleEvent(object sender, EventArgs args)
{
Console.WriteLine("Event handler 1 received the event.");
}
}
public class EventHandler2
{
public void HandleEvent(object sender, EventArgs args)
{
Console.WriteLine("Event handler 2 received the event.");
}
}
class Program
{
static void Main(string[] args)
{
EventSource source = new EventSource();
EventHandler1 handler1 = new EventHandler1();
EventHandler2 handler2 = new EventHandler2();
// 订阅事件
source.MyEvent += handler1.HandleEvent;
source.MyEvent += handler2.HandleEvent;
// 触发事件
source.RaiseEvent();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
在这个示例中,我们定义了一个 EventSource 类,它包含一个名为 MyEvent 的事件。事件处理程序是一个与 EventHandler 委托类型相兼容的方法。我们创建了两个事件处理程序类 EventHandler1 和 EventHandler2。在 Main 方法中,我们创建了 EventSource 实例和事件处理程序实例,然后使用 += 运算符订阅事件。当调用 RaiseEvent 方法时,所有订阅的事件处理程序都会被调用。
# 相似之处
- 两种语言中的事件都遵循观察者模式,允许多个订阅者监听同一个事件源。
- 它们都提供了机制来订阅和取消订阅事件。
- 当事件被触发时,所有订阅的处理程序都会被调用。
# 不同之处
- TypeScript 中的事件通常是基于类的实现,而 C# 中的事件是一种语言级别的构造。
- C# 中的事件使用委托作为事件处理程序的类型,而 TypeScript 中可以使用任何函数类型。
- C# 中的事件具有更强的类型安全性,编译器会检查事件处理程序的签名是否与委托类型匹配。
- C# 中的事件可以被标记为虚拟、抽象或覆盖,支持更好的继承和多态性。
- TypeScript 中的事件实现通常更加灵活和动态,而 C# 中的事件实现更加严格和静态。
编辑 (opens new window)
上次更新: 2024/08/09, 10:55:31