我有一个基本的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,而在第二行则不需要!?
答案 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,因为它是由类的方法提供的。
谢谢大家!