将值断言为字节对象时,对象引用未设置为对象的实例



我正在尝试读取字节数组,我想在列表中存储数组的第一个值。我尝试了一个小型控制台应用程序示例,但遇到了上述问题。我在互联网上搜索了很多,但没有得到答案

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

我相信这是最快的方法。如果有人能证明我是错的,我很想学习。

最新更新