没有参数时格式化字符串?

时间:2013-10-23 23:14:09

标签: c# .net string-formatting

我们有一个日志记录类,它有一个带params的日志方法:

public void LogTrace(String message, params object[] parameters)
{
  ..
  .. String.Format(message, Parameters);

当没有使用params而是使用一些格式化占位符调用LogTrace时,它会做什么样的.NET约定/期望呢? e.g。

LogTrace("This is a {poorly written} log message");

LogTrace("This is {0} log message");

具体来说 - 您是否希望这会抛出异常,或者只是按原样记录纯文本? 在第一种情况下,它只是记录纯文本似乎“很好”,但在第二种情况下,它可能表示您实际上忘记了参数。

从概念上讲,这里似乎有两个不同的功能,一个用于记录纯文本,另一个用于记录格式化的消息。那么也许应该有两种不同的方法?

3 个答案:

答案 0 :(得分:1)

  • String.Format("This is a {0} {1} log message", "poorly");将抛出(一个参数太少)
  • 这是一件好事:这意味着,所涉及的任何设施的记录部分都存在错误。这应该由记录器记录。
  • 你仍然可以通过try-catch-looping传递一个参数(例如“[undefined]”)来解决这个问题(并尽可能地生成原始信息),这将记录This is a poorly [undefined] log message。不要让它成为无限循环!

答案 1 :(得分:1)

string.Format会在需要参数时抛出异常并且您不提供它们。当message格式不正确时,它会抛出异常 - 括号之间有垃圾。您可以防范空参数列表

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
}

当参数的数量与message不对应时仍会出现问题,但我会抛出异常,而不是试图掩盖问题并记录模糊的消息。

答案 2 :(得分:1)

我认为两种方法都可以(如果你真的需要它们):

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.
}

我认为这很容易理解且易于使用。