【问题标题】:Can VB.NET specify the size of an array parameter?VB.NET 可以指定数组参数的大小吗?
【发布时间】:2015-07-24 14:02:33
【问题描述】:

我想创建一个函数,该函数将引用的参数作为对至少一定长度的数组的引用,以便该函数知道有足够的空间来写入它需要写入的所有数据数组。

这在 VB.NET 中可行吗?

目前我正在ReDim'ing 引用的数组,但我不确定这是否真的有效。 (我想我可以测试这个方法并通过将一个数组传递给 small 来打破它,稍后会尝试)

Public Function Foo(ByRef data() As Byte) As Boolean
    If Data.Length < 4 Then
        ReDim Preserve ProductId(4)
    End If
    ' Other operations that put 4 bytes on the array...
    Return True
End Function

即使该方法有效,我也不相信重新调整用户数组的大小真的是一个好主意,而不是仅仅通知他们参数以某种方式指定长度为 4...有没有更好的如何管理?

【问题讨论】:

  • 看起来这个功能可能“做得太多”。它显然找到/获取字节数组,但 also 返回一个布尔值,指示其他内容。如果/当没有数据或其他失败没有返回时,返回一个空数组以表示失败或没有可用的数据。鉴于我们所知甚少,这种方式似乎过于雄心勃勃。
  • 你说得对,@Plutonix。最好为此使用结构,然后让布尔函数采用结构。
  • @Plutonix 该函数与硬件设备交互,该设备在 COM 端口上返回各种非固定长度的数据,其中部分或全部可能为零。布尔值表示通信是否失败或由于某种原因被取消(例如 COM 尚未正确设置),在这种情况下,数组仍将全为零,但不是因为返回的数据为零,所以需要一些辨别差异的方法。
  • @MichaelMcPherson 好建议,我一直在回避它,尽管我正在与之交互的 H/W 有大量设置,我想编写“setter”函数来将它们视为如果它们是属性。为每种不同的设置类型设置不同的结构会使类变得非常混乱。

标签: arrays vb.net parameters pass-by-reference


【解决方案1】:

您的函数应该改为接收流。

Public Function Foo(ByVal stream As Stream) As Boolean
    'Write bytes to stream
End Function

例如,您可以使用 MemoryStream 调用您的方法

Dim stream = new MemoryStream()
Foo(stream)
Dim array = stream.ToArray() 'Call ToArray to get an array from the stream.

【讨论】:

  • 你能详细说明一下吗?我之前没有使用过流,你能推荐一个阅读资源以这种方式或类似的方式使用它们吗?塔
  • 在内存流的情况下,它只是一个自动增长的字节数组。
【解决方案2】:

不,据我所知,您无法在参数列表中指定数组的大小。

但是,您可以像当前一样检查数组的大小,然后抛出 ArgumentException。这似乎是在方法开始时验证数据的最常用方法之一。

【讨论】:

    【解决方案3】:

    我实际上会尝试与您在这里所做的类似的事情,但是像这样:

    Public Function Foo(ByRef data() As Byte) As Boolean
     If Data.Length < 4 Then
        Return False
     End If
    
     'Other operations...
    
      Return True
    End Function
    

    或者这样:

    Public Function Foo(ByRef data() As Byte) As String
     If Data.Length < 4 Then
        Return "This function requires an array size of four"
     End If
    
     'Other operations...
    
      Return "True"
    End Function
    

    然后,在你的调用函数中,这个:

    Dim d As Boolean = Convert.ToBoolean(Foo(YourArray))
    

    然后您可以将错误冒泡给用户,这正是您想要做的,对吧?

    【讨论】:

    • 好吧,我不知道这是可能的(我通常在 C 中编程,将字符串转换为布尔值几乎是可笑的:)),我会试一试
    • 我通常使用 C# 或 PHP,其中多态性很容易。我不得不在 VB.NET 中查找如何做到这一点;)
    • 请抛出一个错误(正如 Chris 建议的那样)而不是这个,这不会使您的代码对其他人(或 6 个月后的您自己)更具可读性,并且通常只是滥用字符串返回类型一次做两件事(错误处理和返回值)
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多