所需代码:
Private ReadOnly cgItems As IDictionary(Of Integer, Item)
Public Function GetItem(itemID as Integer) As Item
Dim item as Item = Nothing
If cgItems.TryGetValue(itemID, item) tThen
Return item
Else
ThrowItemDoesntExist(itemID)
End If
End Function
Private Sub ThrowItemDoesntExist(itemID As Integer)
Throw New ArgumentException($"The Item ID #{itemID} does not exist.", NameOf(itemID))
End Sub
ThrowItemDoesntExist
方法是从许多进行此类检查的地方调用的,因此使用单一方法可以实现一致性和轻松的代码维护。
但是,
GetItem
会引发 BC42105 警告,因为 ThrowItemDoesntExist
无法指示它始终抛出
Exception
。当前解决方法
我当前的解决方法有点笨拙,那就是使用 <DoesNotReturn>
CodeAnalysis
属性。它确实有效,但感觉
错了。
Imports System.Diagnostics.CodeAnalysis
Private ReadOnly cgItems As IDictionary(Of Integer, Item)
Public Function GetItem(itemID as Integer) As Item
Dim item as Item = Nothing
If cgItems.TryGetValue(itemID, item) tThen
Return item
Else
Return ThrowItemDoesntExist(itemID)
End If
End Function
<DoesNotReturn>
Private Function ThrowItemDoesntExist(itemID As Integer)
Throw New ArgumentException($"The Item ID #{itemID} does not exist.", NameOf(itemID))
End Sub
有人可以建议更好的方法吗?更新:
Public Function GetItem(itemID as Integer) As Item
Dim item as Item = Nothing
If Not cgItems.TryGetValue(itemID, item) Then
ThrowItemDoesntExist(itemID)
End If
Return item
End Function
现在我很后悔自己到现在才看到它。