我曾经拥有的:
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channels As IEnumerable(Of ChannelType))
第一个只是调用第二个{channel}
将其参数转换为数组。
我认为必须创建一个通道列表来传递给该方法是很尴尬的,因此选择将两个重载合并到一个方法中,该方法需要ParamArray
.
Public Sub Subscribe(ParamArray channels() As ChannelType)
'Usage
Subscribe(ChannelType.News)
Subscribe(ChannelType.News, ChannelType.Sports)
Subscribe() 'Oops... this is valid
这里的“最佳实践”是什么?我喜欢这种灵活性ParamArray
让我只是让人们传递东西,但它无法帮助开发人员通过编译器错误反馈“更快地失败”......这意味着类似ArgumentException
这里不可能,因为使用此方法的人可能不会编写任何单元测试。一种选择如下...
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channel As ChannelType, ParamArray channels() As ChannelType)
但我觉得这让我几乎回到了原点,令人困惑,并且要求我对该方法的实现不那么直接。
另一个需要考虑的选择是
Module ParamArrayTest
Sub ShowThings(ParamArray MyThings() As Integer)
For Each thing As Integer In MyThings
Debug.Print("{0}", thing)
Next
End Sub
' Don't try to call without parameters:
<Obsolete("Must have at least one parameter", True)> Sub ShowThings()
Throw New ArgumentException("Must specify at least one parameter")
End Sub
Sub Test()
ShowThings(3, 4, 5)
ShowThings()
End Sub
End Module
The <Obsolete()>
第二个参数为的标签True
通知编译器尝试使用标记的方法将导致编译错误。由于当且仅当尝试调用不带任何参数的方法时才会使用所讨论的方法,因此只有在这种情况下才会导致错误。请注意,如果尝试向方法传递以下内容的零元素数组,则不会使用该方法Integer
;在这种情况下,正常的ParamArray
将使用表格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)