首页 > 解决方案 > 我想创建一个新变量,上面写着 shot1 shot2 shot3 等等,我该怎么做?

问题描述

这是我迄今为止尝试过的,但没有声明新的镜头变量

Module Module1
    Dim shotlist As New List(Of Boolean)
    Dim shono As Integer = 0
    Dim shonos As String
    Dim shotname As String
    Dim fshot As Boolean
    Dim shots As String

    Sub Main()
        For i As Integer = 0 To 1000
            Dim ("shots" & i) as String = "shots" & i
            fshot = Convert.ToBoolean(shots)
        Next
    End Sub
End Module

标签: vb.net

解决方案


你不能这样做。编写程序时看到的变量名会丢失,编译器会在编译程序时将其转换为内存地址。您不能使用变量的名称存储任何信息 - 该名称只是您(程序员)在编写程序期间(设计时)的参考

想想像桶这样的变量,外面有标签。存储桶仅在其中保存某些类型的数据

Dim shotname as String

这声明了一个shotname在外面标记的桶,它可以在里面保存一个字符串。你可以在里面放一个字符串:

shotname = "Shot 1"

您可以将任何您喜欢的字符串放入此桶中,因此您可以合理地表示为字符串的任何内容也可以放入此桶中:

shotname = DateTime.Now.ToString()

这需要当前时间并将其转换为看起来像日期/时间的字符串,并将其放入存储桶中。桶中的东西总是一个字符串,很多东西(实际上几乎任何东西)都可以表示为一个字符串,但我们不会将所有桶都输入为字符串,因为它不是很有用 - 如果你有两个桶例如,您可以将它们相乘:

Dim a as Integer
a=2
Dim b as Integer
b=3
Dim c as Integer
c=a*b 

但是你不能将字符串相乘,即使它们是字符串信任看起来像数字;字符串必须首先转换为数字。将所有内容存储为字符串并在处理之前将其转换为其他类型,然后将其转换回字符串以存储它会非常令人厌烦

所以这一切都很好,解决了在计算机内存中存储不同信息并给它一个可以引用它的名称的问题,但这意味着开发人员必须知道将输入到程序中的所有信息。shotname只是一个存储一点信息的桶。当然你可以

Dim shotname1 as String
Dim shotname2 as String
Dim shotname3 as String

但是,为一千个镜头名称执行此操作将是相当乏味的复制粘贴练习,并且在您完成之后,您必须使用它们的全名单独引用它们。编写程序时无法动态引用存储桶标签,因此这不起作用:

For i = 0 To 1000
  shotname&i = "This is shotname number " & i 
Next i

请记住,shotname编译时会丢失,而 i 也会丢失,因此shotname&i无法正常工作。本质上,这两个东西都变成了对编译器有意义的内存地址,您不能将两个内存地址连接在一起以获得存储一些数据的第三个内存地址。它们只是你的好名字,可以帮助你理解如何编写程序,选择好名字,而不是对什么是什么感到困惑

相反,您需要发明的机制以允许在程序设计时不知道不同数量的数据 - 数组

在他们的核心,数组是你想要做的。您正在尝试加载具有名称的存储桶,您可以更改并以编程方式形成名称。

数组命名简单;数组的名称与任何其他变量一样(到目前为止我一直在调用存储桶 - 将切换到调用它们的变量,因为其他人都这样做)并且名称指的是整个数组,但数组是分开的最多分为多个插槽,所有这些插槽都存储相同类型的数据并具有唯一索引。尽管数组本身的名称是固定的,但索引可以变化;它们一起形成了对数组中插槽的引用,并提供了一种可以动态生成名称的机制

Dim shotnames(999) as String

这是一个包含 1000 个字符串的数组,它被称为shotnames. 最好使用复数名称,因为它有助于提醒您它是一个数组,包含多个东西。999 定义了数组中的最后一个有效槽 - 数组从 0 开始,所以这个运行 0 到 999 意味着其中有 1000 个条目

至关重要的是,尽管shotnames变量名的一部分保持固定,并且必须是您用来引用数组本身的部分(如果您想对整个事物做某事,例如将其传递给函数),但引用单个元素/数组中的插槽是通过在括号内的末尾添加一个数字来完成的:

shotnames(587) = "The 588th shotname"

请记住,“从 0 开始”

这个 587 可以来自任何提供数字的东西。编写程序时不必对它进行硬编码:

For i = 0 to 999
  shotnames(i) = "The " & (i+1) & "th shotname"
Next i

或产生数字的事物:

shotnames(DateTime.Now.Minute) = "X"

如果这段代码运行时是 12:59,那么shotnames(59)数组中的第 60 个插槽将被填充X

还有其他种类的不同存储;列表或字典是常用的示例,但它们遵循相同的概念 - 您将获得一个变量,其中部分名称是固定的,部分名称是您可以更改的索引。

从本质上讲,它们也只是数组——如果您查看 List 内部,您会发现一个数组周围有一些额外的代码,当数组变满时,它会创建一个大小为两倍的新数组并复制所有内容。通过这种方式,它提供了“扩展的数组”类型功能——数组本身不具备的功能。

字典值得一提,因为它们提供了一种按数字以外的其他事物进行索引的方法,并且可以存储大量在设计时未知的事物:

Dim x as New Dictionary(Of String, Object)

这将创建一个由存储对象的字符串索引的字典(即任何东西 - 日期、字符串、数字、人..)

你可以这样做:

x("name") = "John"
x("age") = 32

你甚至可以意识到你之前想要做什么:

For i = 0 to 999
  x("shotname"&i) = "The " & (i+1) & "th shotname"
Next i 

(尽管您可能会在 Dictionary(Of string, string) 中执行此操作,即既由字符串索引又存储字符串的字典..您可能不会为了拥有一个存储字典的字典而付出这种努力x("shotname587")当声明数组更简单时shotname(587)

但最初的前提仍然正确:您的变量具有名称的固定部分(即x)和名称的可变部分(即括号中的字符串),用作索引。

而且按字符串索引也没有什么魔力。如果您打开字典并查看其中的内容,您会发现一个数组,以及一些将您传入的字符串作为索引的代码,并将其转换为 587 之类的数字,并存储您想要的信息在索引 587 中。并且有一个例程来处理两个不同的字符串在转换时都变成 587 的情况,但除此之外,这一切都只是“如果你想要一个变量,其中部分名称可以通过编程而不是通过开发者,它是一个数组”


推荐阅读