我们有一个日志记录类,它有一个带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");
具体来说 - 您是否希望这会抛出异常,或者只是按原样记录纯文本? 在第一种情况下,它只是记录纯文本似乎“很好”,但在第二种情况下,它可能表示您实际上忘记了参数。
从概念上讲,这里似乎有两个不同的功能,一个用于记录纯文本,另一个用于记录格式化的消息。那么也许应该有两种不同的方法?
答案 0 :(得分:1)
String.Format("This is a {0} {1} log message", "poorly");
将抛出(一个参数太少)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.
}
我认为这很容易理解且易于使用。
如果您没有参数,请不要期望以任何方式格式化消息。
如果您使用带参数的方法,则必须放置非空对象,并且您应该期望消息和参数相互协作。如果您的代码出现错误,您应该期望在.NET框架中实现标准行为:http://msdn.microsoft.com/pl-pl/library/system.string.format.aspx#Format_Exceptions