C#=>的一点儿理解和测试

本文探讨了一段使用C#实现的WebSocket服务端代码,讲解了Lambda表达式的运用,以及如何通过Action委托处理WebSocket连接的打开、关闭和消息事件。作者指出,Lambda简化了代码,但理解其工作原理需要对回调和闭包有一定的了解。代码示例展示了如何将Lambda表达式转换为普通方法调用的形式,帮助读者深入理解这一概念。
摘要由CSDN通过智能技术生成

简单研究了一下WebSocket,找到网上的一段服务端的C#代码,内容如下:

            FleckLog.Level = LogLevel.Debug;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://192.168.0.103:50000");
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    Console.WriteLine("Open!");
                    allSockets.Add(socket);
                };
                socket.OnClose = () =>
                {
                    Console.WriteLine("Close!");
                    allSockets.Remove(socket);
                };
                socket.OnMessage = message =>
                {
                    Console.WriteLine(message);
                    allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                };
            });

=> 这个玩意儿见了有不少了,但是理解和感性认识还是很表面,再加上delegate的使用问题,搞得很困惑。下面谈谈 server.Start(socket =>…的解释和普通代码形式。

 public void Start(Action<IWebSocketConnection> config);

Start 的参数是一个 Action,并且这个Action 有参数,因此
理解1: 括号里面的一个Action 代理。
理解2:socket 这个action的参数
理解3:这个参数是一个IWebSocketConnection 实例

如图示:

在这里插入图片描述以上代码可以简化为

    server.Start(socket =>
            {
                socket.OnOpen();
                socket.OnClose();
                socket.OnMessage();
            });

到这里大家应该明白了。还有一个困惑是 socket 怎么来的?怎么定义的(很初级的问题,是对lamuda表达不是所致,我深受其害)。

解释:这个是回调时,调用者传过来的参数,因此,编译器是可以感知的。上面代码最终可以用普通代码表示如下:

private void button1_Click(object sender, EventArgs e)
        {
     FleckLog.Level = LogLevel.Debug;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://192.168.0.103:50000");
            server.Start( mySkt);
            ///explanation for the following 
            ///the parameter for Start is a delegate whose parameter is  socket.

            //server.Start(socket =>
            //{
            //    socket.OnOpen() = () =>
            //    {
            //        Console.WriteLine("Open!");
            //        allSockets.Add(socket);
            //    };
            //    socket.OnClose = () =>
            //    {
            //        Console.WriteLine("Close!");
            //        allSockets.Remove(socket);
            //    };
            //    socket.OnMessage = message =>
            //    {
            //        Console.WriteLine(message);
            //        allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
            //    };
            //});
   }
      void wskcOpen()
        {
            Console.WriteLine("Open!");
            //allSockets.Add(socket);

        }
        void wskcClose()
        {
            Console.WriteLine("Close!");
            //allSockets.Add(socket);

        }
        void wskcMessage(string message)
        {
            Console.WriteLine(message);
            //allSockets.Add(socket);

        }
    private void mySkt(IWebSocketConnection wbSktConn)
        {
            wbSktConn.OnOpen += wskcOpen;
            wbSktConn.OnClose += wskcClose;
            wbSktConn.OnMessage += wskcMessage;
        }

这里还涉及闭包的问题,不再赘述。总之,使用Lamda表达式代码要简单很多,理解和感性认识要慢慢来。
马拉孙 于 泛五地区
2021-04-06

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值