变量和声明对象之间的区别

时间:2014-03-04 20:59:59

标签: vb.net oop object

这可能是一个更普遍的问题,但我希望这是一个正确的问题。我不是编写代码的新手,但对VB.net来说有点新鲜。我的背景不是计算机科学,所以我知道从我所学的几门课程,我个人的兴趣和专业需求中我知道。

我想知道的是像字符串这样的变量之间的技术差异:

Dim myString As String

和一个必须实例化的集合之类的变量:

Dim myCollection As Collection
myCollection = New Collection

我意识到后者是一个对象,但是我不确定我理解为什么前者和后者都不以同样的方式实现,而不需要在Visual Basic之外引用?

1 个答案:

答案 0 :(得分:2)

对于VBA和VB.NET,答案是不同的。

实际上,在VB.NET中,你需要实例化一个String。例如,以下代码在VB.NET中抛出异常:

Dim s As String
Dim same As Boolean = s.Equals("")  ' Throws NullReferenceException

它抛出异常的原因是因为您尝试使用当前未引用(指向)任何对象的变量来调用Equals方法。换句话说,s变量当前为空(VB中为Nothing)。要修复它,您需要实例化一个对象,如下所示:

Dim s As String = ""
Dim same As Boolean = s.Equals("")  ' Works (same = True)

但是,您的问题仍然有效,因为您不需要实例化某些类型的变量,例如Integer

Dim i As Integer
Dim same As Boolean = i.Equals(0)  ' Works (same = True)

两者之间的差异是String参考类型(a Class)而Integer值类型(a Structure)。您可以在MSDN here上了解有关差异的更多信息。

在VBA中,差异是相似的,有点黑暗。 VBA有一组核心原始数据类型,不需要实例化(如.NET中的值类型),其他所有内容都被认为是Object,它需要实例化(如.NET中的引用类型)。此外,VBA允许您创建Structure类型,这些类型被视为基本类型,因为您不会实例化它们。

为了进一步复杂化,在VBA中,String是一种原始数据类型,但在VB.NET中它是一种引用类型。