在VB.NET中将一个常量数组传递给函数

7

我知道你可以轻松地将一个数组传递给函数,就像下面的代码所示:

Private Sub SomeFunction(ByVal PassedArray() As String)
    For i As Integer = 0 To PassedArray.Count - 1
        Debug.WriteLine(PassedArray(i))
    Next
End Sub

Public Sub Test()
    Dim MyArray As String() = {"some", "array", "members"}

    SomeFunction(MyArray)
End Sub

但是在 VB.NET 中有没有一种方法可以将常量数组传递给函数呢?

例如,在 PHP 中,您可以编写以下代码:

function SomeFunction($array)
{
    for($i=0;$i<count($array);$i++)
    {
         echo($array[$i]);
    }
}

function Test()
{
    SomeFunction(array("some", "array", "members")); // Works for PHP
}

再次强调一下:在VB.NET中有没有直接将常量数组传递给函数的方法?这样做有什么好处吗?我想可以节省几个字节的内存。

附注:

SomeFunction({"some", "array", "member"}) ' This obviously gives a syntax error
4个回答

5
你能做的最接近的是:

您可以尝试:

SomeFunction(New String() {"some", "array", "members"})

就对象创建而言,这与你所发布的内容完全相同。实际上,在.NET中并没有数组字面量,只有初始化的助手。


是的,当Patrick McDonald发帖时,我就已经想到了这一点。但在回答问题之前,我想确保并进行测试。谢谢大家的回答。 - Gert
我以为由于某些原因 Dim s as String() = {"a", "b", "c"} 不起作用,当我发现它确实起作用时,删除了我的回答,很好地找出了OP确切在问什么。 :) - Patrick McDonald

3

我刚想到的另一件事并不直接回答这个问题,但也许可以理解发帖人的意图——ParamArray关键字。如果您控制所调用的函数,使用它可以使生活更加轻松。

Public Function MyFunction(ByVal ParamArray p as String())
   ' p is a normal array in here
End Function

' This is a valid call
MyFunction(New String() {"a", "b", "c", "d"})

' So is this
MyFunction("a", "b", "c", "d")

3
SomeFunction({"some", "array", "member"}) ' this obviously gives a syntax error

这是一个完全有效的语法,从VB10(Visual Studio 2010)开始。请参见:


1

不,CLI中没有常量数组这一概念;数组始终是可变的。也许ReadOnlyCollection<T>更适合?

在C#中(因此VB可能类似),您可以执行以下操作:

private readonly static ReadOnlyCollection<string> fixedStrings
    = new ReadOnlyCollection<string>(
        new string[] { "apple", "banana", "tomato", "orange" });

这将为您提供一个静态(=共享)的不可编辑、可重复使用的集合。如果方法接受 IList<T>IEnumerable<T> 等(而不是数组 T[]),则此方法特别有效。


也许使用IEnumerable<T>会更好?OP只是用数组来迭代集合。 - Andrew Hare
@Andrew;我刚刚在编辑中加入了这个建议(或者如果方法需要使用索引器,则使用IList<T>)。 - Marc Gravell
根据我的经验,IEnumerable<T> 是方法签名的最佳选择,因为你仍然可以选择使用数组进行调用。如果你正在使用 .NET 3.5,你仍然可以通过 .ElementAt() 扩展方法访问特定位置的元素(尽管如果你经常这样做,你应该传递一个 IList)。 - Ryan Brunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接