Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我对学员来说是新手,不知道如何分解以下代码_C# - Fatal编程技术网

C# 我对学员来说是新手,不知道如何分解以下代码

C# 我对学员来说是新手,不知道如何分解以下代码,c#,C#,我有下面的代码,我想知道如何分解它?这本书写得很好,但它是由一位上师写的,我无法理解。提前感谢您的帮助 代码基本上将发送和接收到的设备信息写入GUI。它似乎有基于设备创建的事件,还调用GUI的东西 为什么需要调用 我想我想知道这是不是太复杂或太恰当了?完成同样任务的更好方法是什么 我还想知道“代表{};”是做什么的 public event EventHandler CommunicationPerformed=委托{} 你问了三个问题,和往常一样,只有一个得到了回答。试着在你的问题中只问一个问

我有下面的代码,我想知道如何分解它?这本书写得很好,但它是由一位上师写的,我无法理解。提前感谢您的帮助

代码基本上将发送和接收到的设备信息写入GUI。它似乎有基于设备创建的事件,还调用GUI的东西

  • 为什么需要调用
  • 我想我想知道这是不是太复杂或太恰当了?完成同样任务的更好方法是什么
  • 我还想知道“代表{};”是做什么的
  • public event EventHandler CommunicationPerformed=委托{}


    你问了三个问题,和往常一样,只有一个得到了回答。试着在你的问题中只问一个问题

    我还想知道
    委托{}
    做什么

      public event EventHandler CommunicationPerformed = delegate { };
    
    与其他答案注释一样,事件在C#中默认为空。此技术使事件处理程序不执行任何操作,但不为null


    不幸的是,C#中的匿名函数有许多语法
    delegate{}
    的意思是“给我一个不做任何事情的函数,它匹配任何无效返回的非ref out形式参数列表”。这就是为什么人们会委托{},因为它几乎可以在需要事件处理程序的上下文中的任何地方工作。

    我认为您需要检查一下这一点

    为什么需要调用

    向事件处理程序广播(以这种方式通知注册此事件的任何一方)

    我想我想知道这是不是太复杂或太恰当了

    *完成同样任务的更好方法是什么

    这并不复杂。这非常简单。*

    我还想知道“代表{};”是做什么的

    我的两分钱。 我不知道您引用的是哪一行代码,但委托是一种包含对方法的引用的类型。委托是用一个签名声明的,该签名显示它引用的方法的返回类型和参数,并且只能包含对与其签名匹配的方法的引用。因此,委托相当于类型安全函数指针或回调。委托声明足以定义委托类。

    我将尝试回答#1和#2(3已经讨论过了)

    #1-在某个时刻,有人决定程序的其他部分可以订阅一个事件,告诉他们何时进行了通信。一旦做出了决定,这就有点像一份“合同”。执行通信->触发通知订阅者已执行通信的事件。这些订阅者对此做了什么,或者为什么他们需要知道……实际上,如果这个课程是你的重点,你根本不关心。至少在理论上是这样。通常情况下,情况确实如此。如果你的班级在做自己的工作,那么你真正关心的不是谁在听这些事件

    #2-我认为在代码中声明事件和事件处理程序的方法过于复杂。很多人(和官员)不同意我的观点。你可以在谷歌上搜索“为什么我的事件处理程序应该使用eventargs”,并阅读大量关于这个主题的文章。另一种方法是:

    public event Action<string, LoaderCommunicationDirection> CommunicationPerformed;
    void PerformWrite()
    {
      string myComm = "String I'm sending";
      //Line of code that performs communication that writes string here
      CommunicationPerformed?.Invoke(myComm, LoaderCommunicationDirection.Write);
    }
    
    执行公共事件行动沟通;
    void PerformWrite()
    {
    string myComm=“我正在发送字符串”;
    //执行在此处写入字符串的通信的代码行
    通信执行?.Invoke(myCMM,LoaderCommunicationDirection.Write);
    }
    

    这比从
    EventArgs
    派生的整个类要简洁得多。但是,它有一个非常明显的缺点,即如果您是事件订阅者……您不知道什么是
    string
    。当然,因为它在代码中被命名为
    value
    ,所以没有多大帮助。事件声明上方的注释也同样有用。

    或HTEJ2很好地回答了您的第一个问题。使用显式Invoke方法允许您利用null条件运算符,这会将触发事件的代码减少一行

    至于这是否过于复杂:不,基本上就是这样做的

    我有时看到的(特别是与MVVM模式中的INotifyPropertyChanged接口相结合)是helper方法,它封装了较长但更明显的C#6之前的代码,并允许您以较少的管道触发事件

    private void FireCommPerformed(string value, LoaderCommunicationDirection direction) 
    { 
        EventHandler handler = CommunicationPerformed;
        if (handler != null)
        {
            handler(this, new LoaderReadWriteEventArgs(value, direction)));
        }
    }
    
    然后您可以这样使用它:

    private string ReadAndUpdateStatus()
    {
        string read = _port.ReadExisting();
        FireCommPerformed(read, LoaderCommunicationDirection.Read);
        return read;
    }
    

    委托{}只是一个空委托,就像事件的null一样。除非代码中的其他方法在运行时订阅该类的CommunicationPerformed事件,否则在触发该事件时不会发生任何事情。

    让我们关注一下这里到底发生了什么。这将帮助你了解其他一切

    CommunicationPerformed?.Invoke(this, new LoaderReadWriteEventArgs(read, LoaderCommunicationDirection.Read));
    
    这是检查委托(事件处理程序是委托)(CommunicationPerformed)是否为null

    委托是指针(但具有额外的功能)

    如果委托(指针)为空,则表示未向其分配任何内容

    指针存储内存位置。在这种情况下,它对函数“this”进行内存引用这是对ReadAndUpdateStatus()的引用

    这一行基本上是这样的:“因为指针是空的,所以让这个指针引用ReadAndUpdateStatus()函数”

    但是事件args呢?好。。。这是代理偏离指针的地方

    代理不仅仅安全地保存和存储内存位置。它们还可以保存参数

    使用从EventArgs扩展的类作为传入参数列表的方式

    从这里开始,执行的事件处理程序(事件处理程序是委托)通信将协调将参数列表发送到任何函数所需的位置

    每当调用通信执行时(例如,被告知
    CommunicationPerformed?.Invoke(this, new LoaderReadWriteEventArgs(read, LoaderCommunicationDirection.Read));
    
    +=CommunicationPerformed(foo,bar)