使用一个ParamArray,但至少需要一个参数(Using a ParamArray, but r

2019-08-01 06:49发布

我曾经有过:

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)

但我觉得这样使我几乎回到原点,是混乱的,并要求我执行该方法的不那么简单。

Answer 1:

另一个值得考虑的选择会

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

所述<Obsolete()>用的第二参数标签True通知试图使用被标记的方法应导致编译错误的编译器。 由于当,并且仅当,是由试图调用的方法没有任何参数有关的方法将被使用,这将只在这样的时候会导致错误。 请注意,如果试图通过该方法的一个零元件阵列将不使用该方法Integer ; 在这种情况下,正常ParamArray将被使用的形式。



Answer 2:

我认为你提到的选项是最好的选择。 使用你的参数更清晰的名称将使其不易混淆:

Public Sub Subscribe(mainChannel As ChannelType, ParamArray otherChannels() As ChannelType)

另一种选择是在运行时执行,但如你所说它不会失败,因为快:

Public Sub Subscribe(ParamArray channels() As ChannelType)
    If channels.Count = 0 then
        Throw new InvalidOperationException("At least one channel is needed")
    End If
End Sub


文章来源: Using a ParamArray, but requiring at least one parameter