我正在尝试改进我的代码中的 FxCop 合规性(有史以来第一次),但我有点陷入道德问题。我有一个GetText()
从远程服务器返回字符串的方法,但在某些情况下会抛出异常。这就是为什么我还有一个方法TryGetText(ByRef text As String)
可以返回一个布尔值来指示调用是否成功。如果为真,则将返回值分配给文本变量。
我认为这种结构是完全可以接受的,考虑到即使是微软也这样做(例如Integer.TryParse
)。不过,FxCop 对我嗤之以鼻,口述“你不能通过引用传递!”
为了规避这个警告(其中有很多),我用 StringBuilder 替换了参数。但是尽管现在符合要求,但我认为它并没有以任何方式真正改进我的代码。
前:
Public Function TryGetText(ByRef text As String) As Boolean
Dim command As New GetTextCommand(Me)
Dim result As CommandResult = ProcessCommand(command, True)
If result.CommandStatus <> Constants.Status.Failed Then
text = result.Text
Return True
Else
Return False
End If
End Function
后:
Public Function TryGetText(builder As Text.StringBuilder) As Boolean
Dim command As New GetTextCommand(Me)
Dim result As CommandResult = ProcessCommand(command, True)
If result.CommandStatus <> Constants.Status.Failed Then
builder.Clear()
builder.Length = result.Text.Length
builder.Append(result.Text)
Return True
Else
Return False
End If
End Function
这是可接受的 ByRef 用法,还是我应该使用 stringbuilder 替代方法?对于使用此构造的每种方法,我都对抑制此警告感到不舒服。我也不觉得 stringbuilder 变体提高了代码可用性。