You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何规范向委托传递参数?下述日志组件传入错误消息的正确方式是什么

两种调用方式的核心区别

  • 直接调用Logger.WriteMessage(error_msg1)
    本质是直接触发公开委托字段的执行,存在两大风险:
    1. 若没有任何方法注册到WriteMessage(委托为null),运行时会直接抛出空引用异常
    2. 因为是公开字段,外部代码可随意通过=赋值覆盖所有已注册的日志方法,也可以无限制直接调用,完全脱离组件的控制
  • 调用Logger.LogMessage(error_msg2)
    本质是通过类封装的公开方法间接触发委托,是更合理的设计:
    1. 可以在方法内部统一添加空校验、参数格式化、日志等级过滤等通用逻辑,无需修改外部调用代码
    2. 后续可将WriteMessage改为私有字段,仅对外暴露委托注册/取消注册的方法,完全控制委托的修改和触发权限

委托传参的规范写法

组件侧实现规范

不要将委托字段直接声明为public,建议做封装处理,示例优化代码如下:

public static class Logger
{
    // 委托字段私有化,禁止外部直接访问
    private static Action<string> WriteMessage;

    // 对外仅开放注册、取消注册的方法
    public static void AddLogWriter(Action<string> logAction)
    {
        if(logAction != null) WriteMessage += logAction;
    }

    public static void RemoveLogWriter(Action<string> logAction)
    {
        if(logAction != null) WriteMessage -= logAction;
    }

    public static void LogMessage(string msg)
    {
        // 空安全调用,无注册方法时也不会抛出异常
        WriteMessage?.Invoke(msg);
    }
}

调用侧规范

  • 统一调用组件提供的公开日志方法Logger.LogMessage触发日志写入,不要直接调用内部委托
  • 传参严格符合委托的签名要求,此处Action<string>要求传入非空字符串类型的日志内容,避免传空或不匹配类型的参数

内容的提问来源于stack exchange,提问作者User456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:48:03