我正在尝试读取字节数组,我想在列表中存储数组的第一个值。我尝试了一个小型控制台应用程序示例,但遇到了上述问题。我在互联网上搜索了很多,但没有得到答案
Sub Main()
Dim lData As New List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
Dim a() As Byte
For ReadValue As Integer = 0 To lBuffer.Length
a(0) = lBuffer(ReadValue)
Exit For
Next
lData.AddRange(a)
End Sub
这里的问题是你已经声明了数组,但你还没有初始化它。通过用Dim a() As Byte
声明一个变量,你已经说了"这个东西存在,这就是它的样子"。但是,您实际上还没有提供任何将占据a()
定义的东西,或者换句话说,您还没有实例化它。
这样想吧。我告诉你,苹果是存在的,它们看起来像形状奇怪的红色球体,里面有种子,它们是可以食用的。现在我要告诉你把苹果里所有的种子都拿出来吃苹果。从苹果中摘下种子是完全可能的,吃苹果也是可能的。但有一个问题,你不能按照我告诉你的去做。为什么?因为我从来没有给你一个苹果来做那些事情。
为了更具体地回答您的问题,您已经创建了一个带有 Dim a() As Byte
的字节数组。这是第一步,你告诉它"嘿,这将是事物的集合,所有这些东西都将是一个Byte
"。数组使用方式的主要问题是,数组在使用它们时需要知道它们有多大。所以你有两个选择,你可以 a) 声明数组的大小,这将创建一个空数组,其中所有元素都是 null 或 b) 你可以像你一样做,然后分配一个已经定义的数组。
我将为您提供这两种方法的示例:
Sub Main()
Dim lData As New List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
' Tell the array how big to be in the first place
Dim a(lBuffer.Length - 1) As Byte
For ReadValue As Integer = 0 To lBuffer.Length - 1
a(ReadValue) = lBuffer(ReadValue)
Next
lData.AddRange(a)
End Sub
Sub Main()
Dim lData As New List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
Dim a() As Byte
' Lets create a temporary list and then use the .ToArray function
' which will return an already instantiated array.
Dim byteList as new List(of Byte)
For ReadValue As Integer = 0 To lBuffer.Length - 1
' Add each item to the list
byteList.Add(lBuffer(ReadValue))
Next
' Now, convert the list to an array and set it to a()
a = byteList.ToArray
lData.AddRange(a)
End Sub
这些选项中的任何一个都应该停止您收到的NullReferenceException
错误。但是,您已经定义并实例化了一个列表(字节),因此最简单的选择可能是直接将值分配给列表:
Sub Main()
Dim lData As New List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
For ReadValue As Integer = 0 To lBuffer.Length - 1
lData.Add(lBuffer(ReadValue))
Next
End Sub
或者更短的代码是使用 Lambda 表达式:
Sub Main()
Dim lData As New List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
lBuffer.ToList.ForEach(Sub(x) lData.Add(x))
End Sub
但是,实现相同目标的最短可能答案是使用 .直接列出扩展:
Sub Main()
Dim lData As List(Of Byte)
Dim lBuffer() As Byte = {5, 99, 4, 7}
lData = lBuffer.ToList()
End Sub
重读后,我想到了一个更短的版本。您可以完全删除字节数组的中间人,只需从数组列表中实例化List(Of Byte)
。
Sub Main()
Dim lData As New List(Of Byte) From {5, 99, 4, 7}
End Sub
我相信这是最快的方法。如果有人能证明我是错的,我很想学习。