【问题标题】:How can I cleanly pass a parameter to a delegate?如何干净地将参数传递给委托?
【发布时间】:2021-10-23 21:09:55
【问题描述】:

以下是委托部分的 MSDN 代码。

代码正常工作,但我想知道如何将消息输入到这个小型日志记录组件中。

哪一种是输入错误信息的正确方法? 我应该使用:Logger.WriteMessage or Logger.LogMessage 虽然两者都在屏幕上打印一条消息

Logger.WriteMessage(error_msg1);

Logger.LogMessage(error_msg2);
using System;

namespace DelegateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string error_msg1 = "101 : Error Disk";
            string error_msg2 = "104 : Error Retriving";

            Logger.WriteMessage += LoggingMethods.LogToConsole;


            Logger.WriteMessage(error_msg1);
            Logger.LogMessage(error_msg2);


            Console.Read();
        }
    }

    public static class Logger
    {
        public static Action<string> WriteMessage;

        public static void LogMessage(string msg)
        {
            WriteMessage(msg);
        }
    }

    public static class LoggingMethods
    {
        public static void LogToConsole(string message)
        {
            Console.Error.WriteLine(message);
        }
    }
}

【问题讨论】:

  • 委托本质上是一个函数,而不是一个组件。你不往里面放任何东西,你调用它并将你想要的数据作为参数传递,和方法一样
  • @PanagiotisKanavos 首先,感谢您帮助我。我知道委托是一个方法/函数,我使用术语组件将整个应用程序称为日志组件。顺便说一句,MSDN doc 也将其称为日志记录组件。问题是有时人们以多种方式使用委托,这使得它难以理解。我看到了其他需要分析的示例。 你能给我一个代表的实际例子吗?
  • 使用 LINQ 时,所有 lambda 表达式都是 Func&lt;&gt; 代表。委托或多或少是一个函数指针,允许您像传递数据一样传递函数。当您使用 Where 时,您告诉 LINQ 使用您作为参数传递给 Where 的委托来过滤某些项目。
  • 您的代码不包含任何名为 LoggerCore 的内容。很难回答您提出的具体问题。还值得注意的是,虽然您展示的代码确实使用了委托功能,但您使用的习惯用法(直接使用+= 来初始化委托实例)并不是您在日常代码中看到的。委托在 .NET 代码中无处不在。它们很少以您使用它们的方式使用
  • @Flydog57 我编辑了第一篇文章。顺便说一句,这不是我的代码,而是 MSDN 文档代码。 link

标签: c# asp.net .net delegates


【解决方案1】:

使用日志消息。它是 Logger 预期 API 的一部分,可能会添加额外的功能(添加时间戳)。它还应该防止 WriteMessage 为空。

Logger.WriteMessage 是“插件”点。你不应该用它来写任何东西,也不应该假设它不为空

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2017-04-05
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多