Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有参数时格式化字符串?_C#_.net_String Formatting - Fatal编程技术网

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

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"); 或 具

我们有一个日志类,它有一个带有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");

具体地说,您希望这会引发异常,还是只是按原样记录纯文本? 在第一种情况下,它只记录纯文本似乎“不错”,但在第二种情况下,它可能表明您实际上忘记了一个参数

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

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