1

我有一个基本的 oop 问题:

我在操作开始时使用(例如在共享点开发中)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,而在第二行不需要!?

4

6 回答 6

1

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

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

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

于 2012-08-13T13:17:32.220 回答
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 对象)

于 2012-08-13T13:21:26.230 回答
0

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

openweb可能会创建一个它返回的新对象,但是执行new. openweb确实如此,或者它返回一个现有的对象。

于 2012-08-13T13:16:01.727 回答
0

new运算符只需调用构造函数。在您的示例中,您使用 指导创建 SPSite 对象New spsite("http://myhost"),但您要求 SPSite 使用 为您创建 SPWeb 对象site.openweb()

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

于 2012-08-13T13:19:36.727 回答
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"

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

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

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

于 2012-08-13T13:58:23.543 回答
0

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

返回新的 B 类

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

谢谢大家!

于 2012-08-14T08:06:30.533 回答