【问题标题】:Variable declaration and assignment变量声明和赋值
【发布时间】:2016-10-11 20:22:22
【问题描述】:

作为一名初级程序员,我试图了解 Visual Basic 中变量声明和赋值的概念。我正在考虑教程中的这段代码:

 Imports System.Text

 Module Module1

        Sub Main()

            Dim myString As StringBuilder = New StringBuilder

            For i = 1 To 10
               myString.Append("-")
               myString.Append(i)
            Next

            Console.WriteLine(myString)
            Console.ReadLine()

        End Sub

 End Module

我的困惑是由于这行:

Dim myString As StringBuilder = New StringBuilder

我认为正在发生的事情是我将变量 myString 声明为 StringBuilder 类的新对象实例(我希望我在这里正确使用了“对象”和“类”这两个词)。但是,为什么 myString 随后需要分配给 New StringBuilder 呢?我不是把它变成了一个带 Dim 的 StringBuilder 吗?而这个例子中 New 运算符的作用是什么?

非常感谢任何有助于我理解的解释。

【问题讨论】:

  • Dim stringBuilder as StringBuilder 声明了对 StringBuilder 实例的引用,该实例在您调用 New 之前不存在。 New 在内存中的某处创建实例,并将 reference 返回到该实例所在的内存区域。
  • PS 我在发布之前发现了这个讨论,但不幸的是它并没有具体解决我的问题。 stackoverflow.com/questions/467843/vb-net-dim-vs-new
  • 该行做了两件事Dim 声明代码将使用变量myString,该变量的类型为StringBuilderNew 创建一个可以使用的StringBuilder 实例。
  • 可以缩短为 Dim myString As New StringBuilder
  • 正如其他 cmets 所暗示的,变量不是对象myString变量。当您编写Dim myString As StringBuilder 时,您只创建了一个变量,而不是对象本身。 object 是通过调用构造函数(即 New)来创建的。

标签: vb.net variable-assignment declaration


【解决方案1】:

线

 Dim myString as StringBuilder 

声明一个用于引用 StringBuilder 实例的变量。在您调用 New 之前,该实例不存在。 New 在内存中的某处创建实例,并返回对该实例所在内存区域的引用。

让我们试着检查一下这条线。
当你写

 Dim myString as StringBuilder = New StringBuilder

(也可以使用Dim myString = new StringBuilder(),编译器可以从上下文中识别变量的类型)

你把两条指令放在一行

Dim myString As StringBuilder
myString = New StringBuilder

在第一行中,您声明了一个要引用 StringBuilder 实例的变量,但此时,该变量(将其视为内存中 4 个字节的区域)不包含任何内容。变量的值没有赋值给任何东西,你可以用

来证明
Dim myString As StringBuilder
Dim b As Boolean = False
b = myString Is Nothing
Console.WriteLine(b)  ' => outputs True

现在,您调用 New StringBuilder 运算符,该运算符搜索一个内存区域,该区域有足够的空间来存储属于 StringBuilder 实例的所有内部字段,在创建此区域后,New运算符调用 StringBuilder 类的无参数构造函数(应该将内部字段初始化为所需的任何内容)并返回指向为 StringBuilder 实例分配的内存区域的值。正是这个值(对...的引用)将分配给您的 myString 变量,现在不再是 Nothing

myString = New StringBuilder()
b = myString Is Nothing
Console.WriteLine(b)   ' => outputs False

【讨论】:

    【解决方案2】:

    发生了什么事,你做了一个快捷方式:

    Dim myString As StringBuilder
    myString = new StringBuilder()
    

    因此不需要分配新的 StringBuilder,因为您已经进行了分配。

    现在 Console.WriteLine 应该是myString.ToString(),就像

    Console.WriteLine (myString.ToString())
    

    这会将 StringBuilder 对象转换为字符串。

    【讨论】:

    • 注意() 在调用构造函数和函数时更可取(c# 中需要,看图)。此外,ToString() 函数将 StringBuilder 对象中的字符串聚合为单个字符串并返回它 - 没有 conversion
    【解决方案3】:

    字符串生成器是一个类。

    当您执行Dim myString as StringBuilder 时,您正在创建一个变量,即内存空间,它将指向StringBuilder 实例的内存位置。

    每当您Dim 某事时,其值将是该类的默认值。对于大多数类,默认值为 null,尽管 Integer 和 Boolean 等 ValueType 具有其他默认值(0 表示 Integer,false 表示 Boolean)

    当您执行= New StringBuilder 时,您正在实例化 StringBuilder 类的对象,现在您的变量 myString 指向内存中的那个位置。

    如果省略这一步,myString.Append("-") 将抛出 NullPointerException,因为 myString 为 null。

    Dim myString As StringBuilder = New StringBuilder 是一种简单的方法:

    Dim myString As StringBuilder
    myString = New StringBuilder
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2016-05-04
      • 2016-01-30
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多