C# 没有参数时格式化字符串?
我们有一个日志类,它有一个带有params的log方法:C# 没有参数时格式化字符串?,c#,.net,string-formatting,C#,.net,String Formatting,我们有一个日志类,它有一个带有params的log方法: public void LogTrace(String message, params object[] parameters) { .. .. String.Format(message, Parameters); 如果调用LogTrace时不使用参数,但使用一些格式占位符,那么.NET约定/期望会是什么?e、 g LogTrace("This is a {poorly written} log message"); 或 具
public void LogTrace(String message, params object[] parameters)
{
..
.. String.Format(message, Parameters);
如果调用LogTrace时不使用参数,但使用一些格式占位符,那么.NET约定/期望会是什么?e、 g
LogTrace("This is a {poorly written} log message");
或
具体地说,您希望这会引发异常,还是只是按原样记录纯文本?
在第一种情况下,它只记录纯文本似乎“不错”,但在第二种情况下,它可能表明您实际上忘记了一个参数
从概念上讲,这里似乎有两个不同的函数,一个用于记录纯文本,另一个用于记录格式化消息。所以也许应该有两种不同的方法?String.Format(“这是一条{0}{1}日志消息”,“糟糕”)代码>将抛出(一个参数太少)
- 这是一件好事:这意味着,无论涉及什么设施,其日志记录部分都存在错误。这应由记录器记录
- 您仍然可以通过尝试捕获循环(通过传递一个参数(例如“[undefined]”)来解决此问题(并尽可能生成原始消息)。此外,这将记录
,这是一条糟糕的[undefined]日志消息。不要让这成为一个无休止的循环李>
string.Format
在需要参数而您不提供参数时将引发异常。当消息
格式不正确时,它将抛出异常-括号中有垃圾。您可以防止出现空参数列表
public void LogTrace(String message, params object[] parameters)
{
if(parameters != null && parameters.Length > 0)
var s = String.Format(message, Parameters);
else
var s = message;
// do something with s
}
当参数的数量与
消息不一致时,它仍然会有问题,但我会让它抛出异常,而不是试图掩盖问题并记录模糊的消息。我认为有两种方法可以(如果您真的需要):
及
我认为这很容易理解和使用
- 如果没有参数,不要期望消息以任何方式格式化
- 如果您使用带有参数的方法,则必须将notnull对象放在其中,并且您应该期望消息和参数能够相互作用。如果代码中出现错误,您应该期望实现.NET framework中的标准行为:
据我所知,您可以只使用1个方法检查参数的计数==0,如果不使用参数,则只使用字符串进行操作。是的,我们从2个方法开始,然后改为1,但从设计角度看,它们似乎有显著不同的函数…我不知道后面是什么,例如,如果您知道最多只传递2或3个(可能更多)参数,那么您可以选择可选参数。是的,我们现在就这样做。但这是最好的办法吗?这是一个.net程序员所期望的吗?零参数的特殊情况允许有无效的格式化指令吗?就我个人而言,如果我错了,我希望该方法抛出异常,而不是对错误代码一无所知,即使它是日志记录。如果您不相信开发人员能够正确调用该方法,则可能需要对其进行重构,以最大限度地降低误用的风险;也许日志不应该抛出错误,而应该尝试“最好”记录它拥有的数据。但是再一次,如果日志记录中有问题,它和其他任何错误一样是一个错误,一个异常将确保它被注意到。我认为这两个都应该做:记录日志记录问题,并尽最大努力记录原始消息。外来错误通常未经充分测试,日志记录中的额外错误不应掩盖另一个值得记录的情况。我个人认为,只要日志记录设施本身是正常的,日志记录就不应该被丢弃。好的一点是,我们可以区分说“我坏了”的日志记录者和说“使用我的人坏了”的日志记录者。这两种情况下,我想提供帮助。这正是我想要的!应引发“日志磁盘已满”,但不应引发“格式错误的日志消息”。
public void LogTrace(String message, params object[] parameters)
{
if(parameters != null && parameters.Length > 0)
var s = String.Format(message, Parameters);
else
var s = message;
// do something with s
}
LogTrace(message, params) {
// just don't catch exceptions from String.Format method, so It
// is possible to throw FormatException or ArgumentNullException
}
LogTrace(message) {
// place a plain text, e.g. This is {0} log.
}