1

基本的なおっと質問があります:

操作の開始時に (たとえば、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 を使用する必要があるのに、2 行目では必要ないのはなぜですか!?

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単にコンストラクターを呼び出します。この例では、を使用してSPSiteオブジェクトのNew spsite("http://myhost")作成を指示していますが、を使用してSPWebオブジェクトを作成するようにSPSiteに要求していますsite.openweb()

また、SharePointはメモリ管理に少し注意が必要であり、実際に自分でクリーンアップすることを心配しなければならない場合があります。 この記事では、オブジェクトをいつ破棄するかについての概要を説明します(C#で記述された3部構成のシリーズですが、原則は同じです)。SharePointアプリケーションを開発している場合は、いつ破棄するかを理解し、 SPDisposeCheckを使用して開発を支援してください。

于 2012-08-13T13:19:36.727 に答える
0

newヒープ上のオブジェクトにメモリを割り当てる演算子です。その後、通常、コンストラクターによって適切に構築されます。これらは基本的に2つのアクションです。openweb既存のインスタンスで呼び出すメソッドのようです。まだそこにあるので、ヒープにさらにメモリを割り当てる必要はありません。

openweb新しいオブジェクトを作成して返す場合がありますが、を実行するのはあなたではありませんnewopenwebまたは、既存のオブジェクトを返します。

于 2012-08-13T13:16:01.727 に答える
0

ありがとう!わかりました。私はクラスaとクラスbを持っています。クラス a のインスタンスを作成します。ここには、たとえば次のようなメソッドがあります

新しいクラスBを返す

したがって、クラスのメソッドによって提供されるため、new を使用する必要はありません。

ありがとうございます!

于 2012-08-14T08:06:30.533 に答える
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は、新しいオブジェクトを作成する必要があるときだけです。したがって、コードでは、最初の行で新しいスプライト オブジェクトを作成し、それを参照する変数を設定する必要があります。openwebただし、2 行目では新しいオブジェクトを作成する必要はありません。メソッドによって返されるオブジェクトを参照するための変数が必要なだけです。openwebおそらく、そのメソッド内のどこかで、内部的にNew演算子を使用して新しいオブジェクトを作成し、それを返します。

ただし、私が言ったことはすべて「参照型」(クラス) にのみ適用されることに注意してください。Integer、Boolean、Date などの「値型」(構造) には当てはまりません。参照型と値型の違いについて調査することをお勧めします。

于 2012-08-13T13:58:23.543 に答える