我注意到在 VS2017 IDE 中,有如下一行
string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
用绿色波浪下划线{4}突出显示。将鼠标悬停在它上面时,会显示警告“格式字符串包含无效的占位符”,这表明 VS2017 的 IDE 能够验证调用 string.Format 等函数的参数。
这很棒,因为我在编写格式字符串和参数之间不匹配的代码时会立即收到有关问题的反馈,而不是稍后在运行时的某个时间。但是,如果我使用与 string.Format 类似的原型定义自己的函数,并且在内部使用 string.Format,则不会进行参数验证。
class Example
{
void ThrowException(string format, params object[] args)
{
throw new Exception(string.Format(format, args));
}
void LogMessage(int errorCode, string format, params object[] args)
{
throw new NotImplementedException("No logger!", new Exception(string.Format(format, args)));
}
void Main()
{
string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
ThrowException("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
LogMessage(0, "{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
}
}
只有带有的行string.Format显示验证错误。这意味着在调用需要相同验证的自定义函数时,我只将问题检测为运行时错误。
我查看了 string.Format 的参考源,希望能够复制配置 IDE 验证的属性,但在那里没有看到任何相关内容,并且无法找出好的搜索词来查找是否已在其他地方询问过(例如,谷歌搜索确切的错误消息似乎只能找到产生错误的 Roslyn 源)
什么控制 IDE 是否对格式字符串执行此类验证,以及如何为我自己的代码(例如示例函数)启用它?
