「インスタンス化」と「初期化」の違いは何ですか?


105

VB.NETのMicrosoftチュートリアルで使用されているこれら2つの単語を聞いています。変数に関して使用する場合、これらの2つの単語の違いは何ですか?

回答:


142

参照型に対する値

C#の変数は2つのグループのうちの1つです。タイプまたは参照タイプ。intおよびのような型DateTime型です。対照的に、作成するクラスはすべて参照型です。C#文字列も参照型です。.NETフレームワークのほとんどのものは参照型です。

変数の部分

変数とその値があります2つの部分

変数の名前は、宣言したとおり名前です。値は何で割り当てることに。

変数は初期化されます

すべての変数には、変数が宣言された時点で常に初期値が与えられます。したがって、すべての変数が初期化されます

以下のために値のタイプ、のようにint明示的にそうしていない場合、コンパイラそれらに有効な値が得られます。intさんは初期化し、デフォルトでゼロにDateTime初期化をするDateTime.MinValueデフォルトで。

参照型変数は、指定したオブジェクトに初期化されます。割り当てない場合コンパイラはオブジェクト(つまり、有効な値)を割り当てません。この場合、値はnull-何もありません。したがって、参照はnullに初期化されると言います。

オブジェクトはインスタンス化されます

人間が生まれる。オブジェクトはインスタンス化されます。赤ちゃんは人間のインスタンスであり、オブジェクトはクラスのインスタンスです。

クラスのインスタンスを作成する行為はインスタンス化と呼ばれます(Ta-Da!)

したがって、宣言初期化、およびインスタンス化は、このようにまとめられます

MyClass myClassyReference = new MyClass();

上記で、「... オブジェクトのインスタンスを作成しています...」と言うのは間違っています


編集-コメントディスカッションに触発されました

異なる用語を使用して(上で)3つの異なることが進行中であり、その用語は互換性がない:

  1. 参照変数が宣言されている- MyClass myClassyReference
  2. オブジェクトがインスタンス化されます(指定されたクラスの /から/ 暗黙的に)-new MyClass()
  3. オブジェクトが変数に割り当てられます。=

事実を再言する:

  1. 参照型変数は、単に「参照」とも呼ばれます。「値型変数」はリファレンスではありません。

  2. これは、「objectAはオブジェクトのインスタンスです」は重大な誤りです。objectAが「objectBのインスタンス」である場合、objectAは、objectBのタイプ(つまり、何であれ)と現在の状態-何であれ、人生を始める必要があります。オブジェクトBが変更されたときにオブジェクトD、E、およびFを作成する場合 いやいや!「objectAはクラスのインスタンス」の概念的および技術的なケースです。「インスタンス化」と「インスタンス」は正確な意味を持っています-オブジェクトはクラスから型、定義、値を取得します。

  3. MyClass myClassyReference = null 通常、「変数はnullに割り当てられている」とは言わず、「変数がnullを参照している」とは言いません。代わりに、「変数はnullです」と言います。または「変数が何も参照していない」、または「参照がnullです」

実用的なアプリケーション:

  • コードを指で叩いて、「このインスタンスには無効なプロパティがあります。多分それがループが失敗した理由です。インスタンス化中にパラメーターを検証する必要があります。」(つまり、コンストラクターの引数)。

  • 私はあなたのコードでこれを見ます、

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    「変数を宣言しましたが、割り当てませんでした。それはnullであるため、何も参照していません。そのため、メソッド呼び出しが例外をスローします。」

編集を終了


存在の耐えられない軽さ

参照型の変数の名前と値が独立して存在しています。そして、私は独立したという意味です。

インスタンス化オブジェクトは、またはそれへの参照を持っていない可能性があります。

インスタンス化されたオブジェクトは、それへの多くの参照を有することができます。

Aは、宣言された基準又はてもしなくてもよいを指しているオブジェクト。



「...オブジェクトのインスタンスを作成しています...」と言うのが間違っている場合、何を言うべきですか?「...オブジェクトをインスタンス化し、それへの参照を割り当てる...」?
Aaron Dake

または「オブジェクトをインスタンス化し、変数をその参照に初期化する」とはどうでしょうか?それは両方の単語を含み、それをすべて綴るようです-とはいえ、かなり長い方法で。どう思いますか?
Aaron Dake

...あなたは何を言うべきですか? 説明:「オブジェクトの...」ではなく、「クラスのインスタンスの作成」。また、「変数をその参照にインスタンス化する」ことは二重の話であり、2つの点で間違っています。(1)オブジェクトのみがインスタンス化されます。(2)オブジェクトを「指す」変数は参照変数です。つまり、変数は参照です。別の言い方をすると、「参照型」変数は参照です。オブジェクトを参照するか、またはポイントします。
レーダーボブ

40

変数は値で初期化されます。オブジェクトはメモリがそれのために割り当てられ、それのコンストラクタが実行されたときにインスタンス化されます。

たとえば、ここに変数があります:

Dim obj as Object

この変数は初期化されていません。obj変数に値を割り当てると、変数が初期化されます。次に初期化の例を示します。

obj = 1
obj = "foo"

インスタンス化は非常に異なるものですが、通常はインスタンス化の後に初期化が続くため、関連しています。

Dim obj As New Object()

前のコード行では、インスタンス化された新しいobj変数への参照を使用して変数が初期化されています。私たちは新しいがあると言う、我々はそれの新しいインスタンスを作成しているので、インスタンス化されました。ObjectObject

上記のコードで割り当てが行われていることが明確でないため、VB.NETはこれをC#よりもはるかに混乱させると思います。C#では、インスタンスのインスタンス化と変数の初期化の両方があることはより明確です。

Object obj = new Object();

@Andrewオブジェクトobj = 1; これは初期化であり、オブジェクトobj = new object()/はインスタンス化および初期化であり、これはあなたが言及したものです。さて、二つお聞きしたいと思います。1.これは何ですか?オブジェクトobj; ?2.オブジェクトobjを使用するとメモリが割り当てられますか?または、このコードオブジェクトobj = 1で初期化したときに割り当てられます。?
kashif 2013年

"object obj"が宣言で、メモリはまだ割り当てられていません。または、少なくとも「null」の値を保持するのに十分なメモリのみ。変数の実際のメモリは、初期化されると値に基づいて割り当てられます。
Aaron Dake

14

何かを初期化するとは、初期値に設定することです。何かをインスタンス化するには、そのインスタンスを作成します。

多くの場合、これはほぼ同じです。この:

SqlConnection conn = new SqlConnection();

インスタンス化SqlConnectionオブジェクトを、そして初期化しconn、そのインスタンスに設定することにより変数。

オブジェクトのコンストラクターもオブジェクトのプロパティをデフォルト値に設定するため、オブジェクトをインスタンス化すると初期化されると言うのは正しいことです。(誤解を招くかもしれませんが、オブジェクトがインスタンス化された後、それを初期化するために明示的に呼び出さなければならないメソッドをオブジェクトが公開する場合、時々そうです)。


4

*インスタンス化とは、クラスまたはオブジェクトのインスタンスを作成することを意味します。初期化とは、*同じオブジェクトまたはクラスを任意の目的で開始することを意味します。**


3

インスタンス化とは、オブジェクトのインスタンスが作成されたことを意味します。開始済みとは、同じオブジェクトが何らかの初期化を行ったことを意味します。


2

クラスまたはオブジェクトをインスタンス化すると、その新しいインスタンスが作成されるか、インスタンスを「保持」するためにメモリが割り当てられます。そのオブジェクトの初期化は、インスタンス化中に実行される指示になります。


2

インスタンス化とは、クラスのインスタンスを作成するときです。そのインスタンスはオブジェクトであり、そのプロパティを設定したり、そのメソッドを呼び出したりできます(何かをするように伝えます)。

開始は、何かの初期条件のセットをセットアップするときです。その何かは、それ自体を開始するように指示するオブジェクト、または単に値を割り当てる変数です。

オブジェクトは他のいくつかのものを初期化したり、開始の一部として他のオブジェクトをインスタンス化したりすることもできます。

違いは、インスタンス化は何かを実行できるものの作成であることです。開始は行われるものです。


1

Javaのドキュメントを参照してください:https : //docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" point originOne = new Point(23、94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."

1

このように見ることができます。以下のコード行の場合:

var p = new Person();

上記の行は、次の2つの方法で読み取ることができます。

  1. 変数pは個人クラスとして初期化されています
  2. Personクラスは変数pでインスタンス化されました

参照またはコンテキストの主題が重要です。変数に関して話すときは、「初期化」という単語を使用しますクラス/タイプの観点から話すときは、インスタンス化という単語を使用します


0

インスタンス化とは、クラスのインスタンスを作成するためのメモリの割り当てを指し、初期化とは、インスタンスに変数名を割り当てることでインスタンスに名前を付けることを指します。

例えば: SqlConnection conn = new SqlConnection();

以下newは、インスタンスにメモリを割り当てるキーワードでconn、そのインスタンスに割り当てられた変数名です。


0

他の人が違いを説明したので、詳細には触れません。ただし、インスタンス化によってオブジェクトが適切に初期化されない場合があります。オブジェクトをインスタンス化するときは、いくつかのデータで初期化します。クラス/タイプには初期化ロジックがありますが、インスタンス化ロジックは通常、newキーワードによって実行されます(基本的にメモリ割り当て、参照コピーなど)。しかし、インスタンス化は必ずしもオブジェクトの有効な状態をもたらす必要はありません。つまり、オブジェクトが初期化されていないと言えます。これは、オブジェクトをインスタンス化できるが初期化できない実用的な例です(たとえばC#で申し訳ありません)。

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject そこでコンストラクタを呼び出してオブジェクトをインスタンス化しません(ただし、内部の魔法がい​​くつかあります)。

また、値の型はインスタンス化されず、初期化のみが可能であると主張することもできます。これは、新しい割り当てが必要ない場合でもnew..、インスタンス化の定義次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.