为什么有时使用“新”构造函数,而不使用其他构造函数(基本的OOP理解)

时间:2012-08-13 13:11:52

标签: .net vb.net oop

我有一个基本的oop问题:

我在操作开始时使用(例如在sharepoint开发中)New构造函数,但后来没有。例如:

' CREATES A INSTANCE OF SPSITE FROM GIVEN URL '
Dim site As spsite = New spsite("http://myhost")

' HERE I DO NOT NEED TO USE NEW(...) AND IT RETURNS AN SPSITE OBJECT, '
' A NEW SPSITE OBJECT '
Dim web As spweb = site.openweb()

我的问题:为什么我需要在网站的第一个对象上使用new,而在第二行则不需要!?

6 个答案:

答案 0 :(得分:1)

这是因为'site'对象实例上的'openweb'方法是为您分配对象(使用new)。然而,在第一行,您自己创建了对象。

在这种情况下,分配openweb实例是spweb方法的函数。

当我们编写代码时,我们负责分配新的对象实例,但通常这些对象也会实例化其他对象的实例。

答案 1 :(得分:1)

我真的不明白你的问题,但是如果你的代码中都有两行(它们应该是),那么它的工作原理如下: 第一行创建一个新的spsite对象,您可以使用名为:site

的变量访问该对象
dim site as spsite = new spsite("http://myhost")

在这里,您可以通过调用先前创建的站点变量的openweb()方法来创建新的spweb变量。这是一个函数调用。此函数返回一个spweb实例,因此您不需要新的实例。

dim web as spweb = site.openweb()

openweb()里面有一个新的spweb(),或者新的spsite(" myhost")为你创建了一个新的openweb(你不必知道,你只需要知道,你会得到一个spweb对象)

答案 2 :(得分:0)

new为堆上的对象分配内存的运算符。然后通常由构造函数正确构造。这些基本上是两个动作。 openweb似乎是您在现有实例上调用的方法。因为它仍然存在,所以您不需要在堆上分配更多内存。

openweb可能会创建一个它返回的新对象,但是执行new的不是你。 openweb可以,或者返回现有对象。

答案 3 :(得分:0)

new运算符只是calls a constructor。在您的示例中,您将使用New spsite("http://myhost")指示创建SPSite对象,但是您要求SPSite使用site.openweb()为您创建SPWeb对象。

此外,SharePoint在内存管理方面有点棘手,有时您实际上不得不担心自己清理后。 This article提供了何时处理对象的非常好的概述(它是用C#编写的三部分系列,但原理是相同的)。如果您正在开发SharePoint应用程序,请自己帮忙并熟悉何时处置,并在开发过程中使用SPDisposeCheck来提供帮助。

答案 4 :(得分:0)

我认为你的困惑可能是你将变量与对象等同起来。变量实际上不是对象,它们只是指向对象(引用)的指针。 New运算符不会创建新变量,而是创建新对象。您可以在不调用New的情况下声明任意数量的变量,因为New运算符与变量无关。任何数量的变量都可以引用单个对象,例如:

Dim variable1 As StringBuilder  ' Declare a new variable
Dim variable2 As StringBuilder  ' Declare a new variable
' At this point, both variables are null (Nothing) because 
' they do not reference/point to any object yet
variable1 = New StringBuilder()  ' Create a new object and set variable1 to reference it
variable2 = variable1  ' Set variable2 to reference the same object as variable1
variable2.AppendLine("Hello world")
Console.WriteLine(variable1.ToString())  ' Writes "Hello World"

正如您在上面的代码中看到的那样,即使我将文本附加到variable2,它也会影响variable1。这是因为追加是由变量指向的对象执行的,而不是由变量本身执行的。因此,由于两个变量都指向同一个对象,因此它们都包含相同的文本,并且会看到对该对象所做的相同更改。

因此,每次声明新变量时都不需要调用New。很多时候,您只需要一个变量来引用已存在的对象。您需要使用New运算符的唯一时间是需要创建新对象时。因此,在您的代码中,第一行需要创建一个新的sprite对象,然后设置一个变量来引用它。但是,第二行不需要创建新对象,它只需要一个变量来引用openweb方法返回的对象。据推测,在openweb方法内部,它在内部使用New运算符创建一个新对象然后返回它。

但是,我应该提到我所说的一切只适用于“引用类型”(类)。 “值类型”(结构)不是这样,例如Integer,Boolean,Date等。我建议对引用类型和值类型之间的区别进行一些研究。

答案 5 :(得分:0)

谢谢!好的,我明白了。我有班级a和班级b。我创建了一个类a的实例,这里我有一个方法,例如

返回新的classB

因此不需要使用new,因为它是由类的方法提供的。

谢谢大家!