【问题标题】:Variable has been used before it has been assigned a value变量在被赋值之前已被使用
【发布时间】:2014-07-29 17:31:38
【问题描述】:

我在任何地方都找不到具体问题的答案,所以我想我会打开一个新问题。

我有一个在 ASCII 和二进制之间转换文本的程序。它通过在第一个数组中查找输入、获取该输入的索引并在第二个数组中查看该索引号来实现此目的,然后将找到的内容写入另一个变量。

代码如下:

Function ConvertBinaryToASCII(ByVal input As String) As String
    Dim ASCIIList() As String = {" ", "!", "a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F", "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L", "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R", "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X", "y", "Y", "z", "Z"}
    Dim BinaryList() As String = {"00100000", "00100001", "01100001", "01000001", "01100010", "01000010", "01100011", "01000011", "01100100", "01000100", "01100101", "01000101", "01100110", "01000110", "01100111", "01000111", "01101000", "01001000", "01101001", "01001001", "01101010", "01001010", "01101011", "01001011", "01101100", "01001100", "01101101", "01001101", "01101110", "01001110", "01101111", "01001111", "01110000", "01010000", "01110001", "01010001", "01110010", "01010010", "01110011", "01010011", "01110100", "01010100", "01110101", "01010101", "01110110", "01010110", "01110111", "01010111", "01111000", "01011000", "01111001", "01011001", "01111010", "01011010"}
    Dim BinarySubstrings = Enumerable.Range(0, input.Length \ 8).[Select](Function(i) input.Substring(i * 8, 8)).ToArray()
    Dim counter As Integer = 0
    Dim result() As String
    Dim binaryMatch As Integer

    For Each e As String In BinarySubstrings
        binaryMatch = Array.IndexOf(BinaryList, e)
        result(counter) = ASCIIList(CInt(binaryMatch))
        counter += 1
    Next

    Return String.Join("", result)
End Function

该函数按预期工作,但问题是无论我如何尝试调用或初始化result,它总是给我一些错误,我不知道如何使用它。

【问题讨论】:

  • Dim result() As String 缺少数组的大小。也许List(Of String) 会更好。
  • 如果我手动指定长度,它仍然会报错,如果我尝试将其初始化为List(Of String),它仍然会报错,错误总是不同的,但总是有错误。跨度>
  • 问题是没有提到数组的大小或初始化它,所以最好将结果数组声明更改为Dim result(55) As String,因为数组只有54个成员和一个额外的“”

标签: vb.net


【解决方案1】:

使用 List(Of String) 更好,因为您不需要知道数组的大小。
当然使用前需要初始化List(Of String)。

Function ConvertBinaryToASCII(ByVal input As String) As String
    Dim ASCIIList() As String = .....
    Dim BinaryList() As String = ......
    Dim BinarySubstrings = Enumerable.Range(0, input.Length \ 8).[Select](Function(i) input.Substring(i * 8, 8)).ToArray()
    Dim result = new List(Of String)()
    Dim binaryMatch As Integer

    For Each e As String In BinarySubstrings
        binaryMatch = Array.IndexOf(BinaryList, e)
        result.Add(ASCIIList(CInt(binaryMatch)))
    Next

    Return String.Join("", result.ToArray())
End Function

【讨论】:

    【解决方案2】:

    您已经声明了一个数组result,但尚未为该变量分配数组实例,因此它为空。您不能将对象添加到空数组。也许你的意思是:

    Dim result(BinarySubstrings.Length) As String
    

    如果您不确定结果的大小,请考虑使用 cmets 中提到的 List(Of String)

    【讨论】:

      【解决方案3】:

      有一种更简单的方法:

      Function BinaryStringToAscii(s As String) As String
          If s.Length Mod 8 <> 0 Then
              Throw New ArgumentException("String length is not a multiple of 8.")
          End If
      
          Dim sb As New Text.StringBuilder
      
          For i = 0 To s.Length - 1 Step 8
              Dim bin = s.Substring(i, 8)
              sb.Append(Chr(Convert.ToInt32(bin, 2)))
          Next
      
          Return sb.ToString()
      
      End Function
      

      它使用 StringBuilder,因为最后你需要一个字符串,不需要使用数组或列表。 Convert.ToInt32 函数有一个有用的重载,您可以在其中指定转换字符串的基数(2、8、10 或 16)。

      反之亦然:

      Function AsciiToBinaryString(s As String) As String
          Dim sb As New Text.StringBuilder
          For Each c In s
              sb.Append(Convert.ToString(Asc(c), 2).PadLeft(8, "0"c))
          Next
      
          Return sb.ToString()
      
      End Function
      

      【讨论】:

      • +1 可能也更快,尽管你必须有一个长字符串才能让它足够重要
      • @Plutonix 哦,你不得不去提一下速度,不是吗? :) 在我的测试(.NET 4.5,发布版本)中,对于小字符串(约 100 个 ASCII 字符),它的速度提高了约 16 倍,降低了约 5 倍(约 1,000,000 个 ASCII 字符)。而且它使用的内存更少。
      • 我回家后试试看。如果你想查看代码,看看是否可以进行任何其他优化,SF项目是here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      相关资源
      最近更新 更多