我试图提高FxCop在我的代码中的符合性(这是有史以来的第一次),但我有点卡在道德问题上。我有一个方法GetText()
从远程服务器返回一个字符串,但可以在某些情况下抛出异常。这就是为什么我也有一个方法TryGetText(ByRef text As String)
返回一个布尔值,它表示调用是否成功。如果为true,则将返回值分配给文本变量。'TryAction()'方法是否邪恶?
我认为这种结构是完全可以接受的,因为即使是微软也这么做(例如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变体也改进了代码的可用性。
我可能已经做了这样的事情,但空(或空)(或者甚至是空白)都是可能的返回值。只有当服务器拒绝返回文本时,调用才会失败。我的代码需要知道它是否失败,或者服务器是否返回空字符串。 –
然后,您最好使用byref和SuppressMessageAttribute。无论是这样或者你可以通过将你的响应包装在一些可以告诉你操作状态的东西中,使得事情复杂化,除了实际的字符串结果。 –
我猜通过使用这些所谓的元组?我应该仔细研究一下。我不认为我以前曾经使用过一个元组...... –