2014-11-22 63 views
0

因此,我下面的代码:CA1806 DoNotIgnoreMethodResults错误地引发?

[Conditional("DEBUG")] 
internal static void WriteGLResult(string methodName, object result, 
    params object[] args) 
{ 
    string message = String.Format(CultureInfo.InvariantCulture, "{0}({1}) = {2}", 
     methodName, String.Join(", ", args), result); 
    Write(LogType.Information, Category.GLResult, 2, message); 
} 

我清楚地分配String.Format()结果变量message。之后我也将该实例传递给Write方法。然而,CA1806升高:

不要忽略方法结果

'Log.WriteGLResult(字符串,对象,params对象[])' 电话“的String.format(的IFormatProvider,字符串,params对象[ ])',但不使用该方法返回的新字符串实例。通过该实例作为参数传递给另一个方法,实例分配给一个变量,或删除的通话,如果它是unnecessary.`

在叫Write方法,我还使用字符串,命名有format ,因为它是这样使用的:

[Conditional("DEBUG")] 
private static void Write(LogType logType, Category category, int stackTraceFrameSkips, 
    string format, params object[] args) 
{ 
    // ... 
    string message = String.Format(CultureInfo.InvariantCulture, format, args); 
    // ... 
} 

我不知道如何解决这个警告。我怀疑CA错误地提出了这个问题。

你能帮我吗?

+1

如何定义“写入”?我问,因为我的第一个猜测是它应用了['ConditionalAttribute'](http://msdn.microsoft.com/zh-cn/library/system.diagnostics.conditionalattribute%28v=vs.110%29.aspx)并且在CA确定是否曾经使用过“消息”之前呼叫结束。你可以尝试提供一个最小化的完整程序,它有你描述的问题吗? – hvd 2014-11-22 23:04:45

+0

@ hvd:是的,就是这样。所有的写入调用(这个和被调用的)都用'[Conditional(“DEBUG”)]'属性装饰。如果我没有这些建设,我不会收到警告。我将它添加到我的问题中的片段。添加它作为答案,我会接受。 =) – 2014-11-22 23:10:54

回答

1

从注释展开:

由于Write被定义为

[Conditional("DEBUG")] 
private static void Write(LogType logType, Category category, int stackTraceFrameSkips, 
    string format, params object[] args) 

这意味着到Write呼叫将不定义DEBUG符号时,可以完全除去。代码分析稍后运行,到那个时候它可以确定(正确)从未使用message

的东西,既不警告在调试也不在发布模式,您威力要调用String.Format直接移动到方法的参数:

Write(LogType.Information, Category.GLResult, 2, 
    String.Format(CultureInfo.InvariantCulture, "{0}({1}) = {2}", 
    methodName, String.Join(", ", args), result)); 

这应该确保String.Format只调用时将会调用Write

+0

伟大的解决方案,完美的工作。 – 2014-11-22 23:25:04