字符串。格式具有以下方法签名
string.Format(format, params, .., .. , ..);
我想像一样每次都通过自定义格式
string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb}
string name = "Foo";
string message = ProcessMessage(custFormat, name);
public string ProcessMessage(custFormat, name)
{
return string.Format(custFormat, name);
}
我想在传递到ProcessMessage之前验证custFormat中的值,以避免出现异常。
让我们考虑一下这个API,如果它存在的话。目标是预先验证一个格式字符串,以确保String.Format
不会抛出。
请注意,不包含有效格式槽的任何字符串都是有效格式字符串-如果您不尝试插入任何替换项。
->因此,我们需要输入我们希望取代的数字或参数
请注意,有很多不同的专业格式模式,每种模式都对特定类型有特定的含义:http://msdn.microsoft.com/en-us/library/system.string.format.aspx
尽管如果传递的格式字符串与参数类型不匹配,String.Format
似乎不会抛出,但在这种情况下,格式化程序将变得毫无意义。例如String.Format("{0:0000}", "foo")
->因此,只有当您也传递了参数的类型时,这样的API才会真正有用。
如果我们已经需要传入我们的格式字符串和类型数组(至少),那么我们基本上处于String.Format
的签名,那么为什么不使用它来处理异常呢?如果String.TryFormat
这样的东西存在就好了,但据我所知,它没有。
此外,通过某些API进行预验证,然后在String.Format
中重新验证本身并不是理想的性能。
我认为最干净的解决方案可能是定义一个包装器:
public static bool TryFormat(string format, out string result, params Object[] args)
{
try
{
result = String.Format(format, args);
return true;
}
catch(FormatException)
{
return false;
}
}
只要只传入一个参数,就可以在custFormat
中查找{0}
。如果你找不到它,它就是无效的。
您可以使用try-catch进行验证,如果您记录信息并停止处理,则格式抛出异常。
try
{
string.Format(custFormat, params, .., .. , ..);
}
catch(FormatException ex)
{
throw ex;
}
string message = ProcessMessage(custFormat, name);
您应该使用正则表达式进行语法检查,也可以使用一些语义检查。
正则表达式应为:(*{d+}*)+