2012-10-09 76 views
5

我曾经有:使用一个ParamArray,但至少需要一个参数

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) 

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

回答

11

要考虑的另一个选择是

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第二个参数通知尝试使用标记的方法应该R上的编译器编译错误。由于当且仅当尝试调用没有任何参数的方法时才会使用有问题的方法,因此只会在这种情况下导致错误。请注意,如果尝试将方法传递给Integer的零元素数组,则不会使用该方法;在这种情况下,将使用正常的ParamArray表格。

+0

这很聪明! –

+0

我认为这个答案得到它......对不起@元骑士!我喜欢我如何获得编译器反馈,并且能够简单地遍历ParamArray而不必使用ParamArray对单个项进行连接来迭代我的参数,从而获得了直接的易用性。 –

+2

@JeffBridgman:请注意,与具有单独参数的方法不同,此代码使代码可以传入包含所有参数的数组,而不必传递第一个项目和包含其余数组的数组;因此,虽然它可以禁止使用空参数列表进行调用,但它在编译时不能禁止使用空数组进行调用。 – supercat

6

我认为你提到的选项是最好的选择。使用你的参数更清晰的名称将使它不那么混乱:

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 
+0

很好的答案!如果我有一个主要频道和附加频道的问题域,那么您提到的第一个选项将是完美的! –

相关问题