如何在C#中用一行语句同时完成日志记录与方法返回操作?
如何在C#中用一行语句同时完成日志记录与方法返回操作?
兄弟我太懂你这种纠结了!写C#的时候碰到这种重复的「判断不满足→打日志→返回」的代码块,真的感觉啰嗦又冗余,就想能不能像JS那样一行搞定对吧?
先看看你现在写的冗余代码,是不是每次都要写两行:
void myBigFunction() { doSomething(); if (somethingAintRight()) { _log.LogWarning("Something ain't right"); return; } doSomethingElse(); if (somethingElseAintRight()) { _log.LogWarning("Failed to do the 'else' thing"); return; } }
你想要的理想写法大概是这样(像JS那样紧凑):
doSomething(); if (somethingAintRight()) return _log.LogWarning("Something ain't right"); doSomethingElse(); if (somethingElseAintRight()) return _log.LogWarning("Failed to do the 'else' thing");
但问题就出在C#的规则上:LogWarning是void方法,return后面不能跟void类型的调用,这直接就把这条路堵死了。你提到的给日志方法加返回值(比如返回空字符串)的办法确实能work,但把void日志方法改成返回string的,总感觉有点不伦不类,不够“纯粹”。
那有没有更优雅的办法?给你几个实用的思路:
思路1:封装一个「判断+日志」的辅助工具类
不用改原来的日志方法,专门写个静态工具类把重复逻辑包起来:
public static class Guard { // 当条件为true时,打日志并返回true,方便调用方直接return public static bool ShouldExitAndLog(bool condition, ILogger log, string warningMsg) { if (condition) { log.LogWarning(warningMsg); return true; } return false; } }
然后调用的时候就可以写成一行:
void myBigFunction() { doSomething(); if (Guard.ShouldExitAndLog(somethingAintRight(), _log, "Something ain't right")) return; doSomethingElse(); if (Guard.ShouldExitAndLog(somethingElseAintRight(), _log, "Failed to do the 'else' thing")) return; }
这种方式既保持了原有日志方法的纯粹性,又把代码压缩到了一行判断+返回,效果和你想要的几乎一样。
思路2:给日志方法加重载,支持返回dummy值
如果你能接受修改日志类的话,可以加一个带返回值的重载版本:
// 原来的void版本保留,不影响其他调用 public void LogWarning(string message) { _innerLogger.LogWarning(message); } // 新增带返回值的重载,返回一个dummy值 public string LogWarningWithReturn(string message) { LogWarning(message); return string.Empty; }
然后就能像你想的那样一行搞定:
if (somethingAintRight()) return LogWarningWithReturn("Something ain't right");
虽然这个方案要改日志类,但胜在调用时的写法足够简洁,完全符合你想要的风格。
额外吐槽:真的羡慕ABAP的CHECK语句
我也觉得ABAP的CHECK语句太香了!直接判断条件,不满足就退出当前方法,这种语法糖要是能加到C#里,真的能省好多冗余代码。不过咱们自己封装的辅助方法,其实也能实现类似的效果,聊胜于无吧~
内容来源于stack exchange
相关产品推荐
相关产品推荐

