在将值分配给字节对象时,不将对象引用设置为对象的实例

时间:2015-03-11 11:14:49

标签: vb.net vb.net-2010

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

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

1 个答案:

答案 0 :(得分:1)

你的问题是你已经声明了数组,但你还没有初始化它。通过使用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错误。但是,您已经定义并实例化了List(of Byte),因此最简单的选项可能就是直接将值分配给列表:

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

然而,实现相同目标的最短答案是直接使用.ToList扩展名:

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

而且我相信这是最简单的方法。如果有人能证明我错了,我很乐意学习。