如何规范向委托传递参数?下述日志组件传入错误消息的正确方式是什么
两种调用方式的核心区别
- 直接调用
Logger.WriteMessage(error_msg1)
本质是直接触发公开委托字段的执行,存在两大风险:- 若没有任何方法注册到
WriteMessage(委托为null),运行时会直接抛出空引用异常 - 因为是公开字段,外部代码可随意通过
=赋值覆盖所有已注册的日志方法,也可以无限制直接调用,完全脱离组件的控制
- 若没有任何方法注册到
- 调用
Logger.LogMessage(error_msg2)
本质是通过类封装的公开方法间接触发委托,是更合理的设计:- 可以在方法内部统一添加空校验、参数格式化、日志等级过滤等通用逻辑,无需修改外部调用代码
- 后续可将
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
相关产品推荐
相关产品推荐

