首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ParamArray,但至少需要一个参数

使用ParamArray,但至少需要一个参数
EN

Stack Overflow用户
提问于 2012-10-10 02:35:26
回答 2查看 10.8K关注 0票数 5

我曾经拥有的东西:

代码语言:javascript
复制
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channels As IEnumerable(Of ChannelType))

第一个函数只调用第二个函数,并使用{channel}将其参数转换为数组。

我认为必须创建一个要传递给该方法的通道列表是很笨拙的,于是我选择将两个重载合并为一个接受ParamArray的方法。

代码语言:javascript
复制
Public Sub Subscribe(ParamArray channels() As ChannelType)

'Usage
Subscribe(ChannelType.News)
Subscribe(ChannelType.News, ChannelType.Sports)
Subscribe() 'Oops... this is valid

这里的“最佳实践”是什么?我喜欢ParamArray给我的灵活性,让人们传递东西,但它不能帮助开发人员通过编译器错误反馈来“更快地失败”……这意味着像ArgumentException这样的东西在这里是不可能的,因为使用这种方法的人可能不会编写任何单元测试。其中一个选项如下...

代码语言:javascript
复制
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channel As ChannelType, ParamArray channels() As ChannelType)

但我觉得这让我几乎回到了起点,令人困惑,并要求我对该方法的实现不那么直接。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-10 07:17:40

另一个需要考虑的选项是

代码语言:javascript
复制
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

带有第二个参数True<Obsolete()>标记通知编译器,试图使用所标记的方法将导致编译错误。由于所讨论的方法将在且仅当尝试在没有任何参数的情况下调用该方法时使用,因此只有在这种情况下才会导致错误。请注意,如果试图向该方法传递Integer的零元素数组,则不会使用该方法;在这种情况下,将使用普通的ParamArray形式。

票数 12
EN

Stack Overflow用户

发布于 2012-10-10 02:41:22

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

代码语言:javascript
复制
Public Sub Subscribe(mainChannel As ChannelType, ParamArray otherChannels() As ChannelType)

另一种选择是在运行时强制执行它,但正如您所说的,它不会失败得那么快:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12806267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档