我问了一个单独的问题(现已删除),我认为实际问题是什么。
.NET Jitter是否真的不能执行此循环:
Private Shared Sub CheckXmlValidity(ByVal textReader As System.IO.StreamReader)
Try
' Check for "interesting" xml documents.
Dim settings = New System.Xml.XmlReaderSettings()
settings.XmlResolver = Nothing
settings.MaxCharactersInDocument = 655360
' Successfully parse the file, otherwise an XmlException is to be thrown.
Dim reader = System.Xml.XmlReader.Create(textReader, settings)
Try
While reader.Read()
'Just checking.
End While
Finally
reader.Close()
End Try
Catch ex As Exception
Throw New HttpException(500, "Invalid Xml data", ex)
End Try
End Sub
我希望不完全是因为可以引发异常的副作用,但我只是在检查......
答案 0 :(得分:3)
JITer,实际上是任何优化器,只能删除对问题执行没有影响的项目。证明一种方法没有效果在.Net中很难做到。特别是因为如果源对象是null
(它会抛出异常),每个方法调用都会产生影响。因此,如果没有插入null
种类检查(1)
在这种情况下,XmlReader.Read
是未密封类型的abstract
方法,这种方法更难。如果JITer知道XmlReader.Read
的每个实现都是无操作,那么它只能删除此调用,因此无效。它不可能知道这一点,因为XmlReader
的派生数不是固定集。可以随时使用XmlReader
的新派生来加载新的DLL,其具有有意义的定义,因此无法进行优化。
(1)注意:我不是说JITer会这样做,只是如果它删除了方法,则需要进行某种形式的null
检查。