Vb.net 是什么导致了';CA2202:不要多次处理对象';在这段代码中,我如何重构?

Vb.net 是什么导致了';CA2202:不要多次处理对象';在这段代码中,我如何重构?,vb.net,visual-studio,code-analysis,Vb.net,Visual Studio,Code Analysis,下面的函数用于序列化对象而不添加XML声明。我刚刚在Visual Studio 2012中打开了包含它的项目,代码分析中出现了“CA2202:不要多次处理对象”警告 现在,在其他情况下,我已通过删除[object]修复了此警告。关闭不需要的[object]。但在这种情况下,我看不到需要修改的内容,而“while being precision”并不能确切地说明它是如何产生的或如何修复的 到底是什么原因导致警告显示,我如何重构以避免它 ''' <summary> ''' Seriali

下面的函数用于序列化对象而不添加XML声明。我刚刚在Visual Studio 2012中打开了包含它的项目,代码分析中出现了“CA2202:不要多次处理对象”警告

现在,在其他情况下,我已通过删除[object]修复了此警告。关闭不需要的[object]。但在这种情况下,我看不到需要修改的内容,而“while being precision”并不能确切地说明它是如何产生的或如何修复的

到底是什么原因导致警告显示,我如何重构以避免它

''' <summary>
''' Serialize an object without adding the XML declaration, etc.
''' </summary>
''' <param name="target"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function SerializeElementToText(Of T As New)(target As T) As String
    Dim serializer As New XmlSerializer(GetType(T))
    'Need to serialize without namespaces to keep it clean and tidy
    Dim emptyNS As New XmlSerializerNamespaces({XmlQualifiedName.Empty})
    'Need to remove xml declaration as we will use this as part of a larger xml file
    Dim settings As New XmlWriterSettings()
    settings.OmitXmlDeclaration = True
    settings.NewLineHandling = NewLineHandling.Entitize
    settings.Indent = True
    settings.IndentChars = (ControlChars.Tab)
    Using stream As New StringWriter(), writer As XmlWriter = XmlWriter.Create(stream, settings)
        'Serialize the item to the stream using the namespace supplied
        serializer.Serialize(writer, target, emptyNS)
        'Read the stream and return it as a string
        Return stream.ToString
    End Using 'Warning jumps to this line
End Function

尝试修改代码,使其具有两个单独的用法:

Using stream As New StringWriter()
    Using writer As XmlWriter = XmlWriter.Create(stream, settings)

    End Using
End Using

这是一个错误的警告,由XmlWriter处理您传递的流引起。这使得StringWriter被处理了两次,第一次是XmlWriter,第二次是Using语句

这不是问题,两次处理.NET framework对象不是错误,也不会造成任何问题。如果Dispose()方法的实现很差,这可能是一个问题,FxCop不会冒险不告诉您,因为它没有足够的智能来知道Dispose()方法是否正确


没有任何方法可以重写代码以避免警告。StringWriter实际上没有任何要处理的内容,所以将其从Using语句中移出是可以的。但这将产生另一个警告,CA2000。最好的办法就是忽略这个警告。如果不想再次查看,请使用SuppressMessage属性。

有趣的是,该警告在Visual Studio 2008中没有为我显示。据我记忆所及,它也没有在VS2010中显示。我今天才刚刚升级到VS2012,所以你们可以在MSDNHm上参考,是的,你们是对的。在重新进行分析后,我可以看到。可能是重复的
Using stream As New StringWriter()
    Using writer As XmlWriter = XmlWriter.Create(stream, settings)

    End Using
End Using