C#的Tag Message回顾:繁琐而危险

开发 后端
本文回顾了C#的Tag Message的使用方法,并通过图示指出,在C#中使用Tag Message是十分繁琐和危险的。

一般来说,Erlang的消息是一个元组,而元组的***个元素为原子,用来标识“做什么”。这个原子被称为是这个消息tag,这种用法被叫做Tag Message,它是“Erlang编程规范”中的推荐用法。在C#中,我们当然也可以这么做:

C#的Tag Message

  1. class Person : Actor<Message>  
  2. {  
  3.     protected override void Receive(Message message)  
  4.     {  
  5.         if (message.Tag == "Chat")  
  6.         {  
  7.             Person another = (Person)message.Arguments[0];  
  8.             Topic topic = (Topic)message.Arguments[1];  
  9.             // ...  
  10.         }  
  11.         else if (message.Tag == "Eat")  
  12.         {  
  13.             Restaurant restaurant = (Restaurant)message.Arguments[0];  
  14.             // ...  
  15.         }  
  16.         else if (message.Tag == "Work")  
  17.         {  
  18.             Person reportTo = (Person)message.Arguments[0];  
  19.             Job job = (Job)message.Arguments[1];  
  20.             // ...  
  21.         }  
  22.     }  

C#的Tag Message图示如下:

C#的Tag Message 

C#的Tag Message这个方式和Erlang可谓如出一辙,但是由于缺少了Erlang的模式匹配和自动绑定,于是C#代码需要大量的if…else判断,以及繁琐而危险的转型操作。此外,和Erlang中动态类型的缺点完全相同,无论是消息的发送还是接受完全不是静态类型的,因此无论是静态检查,编辑还是重构都比较困难。试想,如果一个公用的服务所接受的消息结构改变了,那么所有用到它的地方都必须修改正确——如果缺少静态检查,错误都只能在运行时才能发现。Erlang有着强大的动态升级能力,尚可接受不断地在线更新。而在.NET平台中,如果使用这种Tag Message的方式,待到运行时发现错误,要修改起来就比较麻烦了。

【编辑推荐】

  1. Erlang的Actor回顾:将消息转化为逻辑执行
  2. Actor模型的本质:究竟是要解决什么问题
  3. 顺畅的使用C# Actor:另一个解决方案
  4. C# Actor的尴尬与F#美丽外表下的遗憾
  5. 看Erlang中Actor模型的执行方式和优劣
责任编辑:yangsai 来源: 老赵点滴
相关推荐

2020-09-15 09:23:19

C++WindowsC#

2009-08-13 09:46:49

C#历史C# 4.0新特性

2009-08-25 17:15:50

C#隐藏C#重写C#重载

2009-09-02 10:58:02

C#动态数组

2021-03-15 08:18:23

C#反射模块

2009-09-02 17:10:45

C#语言入门

2009-09-01 18:29:10

C#继承C#多态

2009-08-27 16:18:47

C#类C#结构体

2009-08-26 09:54:45

C#打印预览C#打印

2009-08-25 17:21:31

C#索引

2009-08-13 17:04:09

C#语言C#程序

2009-08-27 16:11:03

C# delegateC# event

2009-08-25 17:59:49

C#入门

2011-07-06 09:46:56

C#

2009-07-30 15:24:13

C#析构函数C#构造函数

2011-07-06 09:44:34

C#

2009-08-18 10:48:25

C#事件

2009-08-25 15:09:30

C#线程的启动

2009-08-18 10:30:30

C#枚举

2009-08-26 10:34:15

C#类型C#变量
点赞
收藏

51CTO技术栈公众号