VB.NETのMicrosoftチュートリアルで使用されているこれら2つの単語を聞いています。変数に関して使用する場合、これらの2つの単語の違いは何ですか?
VB.NETのMicrosoftチュートリアルで使用されているこれら2つの単語を聞いています。変数に関して使用する場合、これらの2つの単語の違いは何ですか?
回答:
C#の変数は2つのグループのうちの1つです。値タイプまたは参照タイプ。int
およびのような型DateTime
は値型です。対照的に、作成するクラスはすべて参照型です。C#文字列も参照型です。.NETフレームワークのほとんどのものは参照型です。
変数名とその値があります。2つの部分。
変数の名前は、宣言したとおりの名前です。値は何で割り当てることに。
すべての変数には、変数が宣言された時点で常に初期値が与えられます。したがって、すべての変数が初期化されます。
以下のために値のタイプ、のようにint
明示的にそうしていない場合、コンパイラそれらに有効な値が得られます。int
さんは初期化し、デフォルトでゼロにDateTime
の初期化をするDateTime.MinValue
デフォルトで。
参照型変数は、指定したオブジェクトに初期化されます。割り当てない場合、コンパイラはオブジェクト(つまり、有効な値)を割り当てません。この場合、値はnull
-何もありません。したがって、参照はnullに初期化されると言います。
人間が生まれる。オブジェクトはインスタンス化されます。赤ちゃんは人間のインスタンスであり、オブジェクトはクラスのインスタンスです。
クラスのインスタンスを作成する行為はインスタンス化と呼ばれます(Ta-Da!)
MyClass myClassyReference = new MyClass();
上記で、「... オブジェクトのインスタンスを作成しています...」と言うのは間違っています。
編集-コメントディスカッションに触発されました
異なる用語を使用して(上で)3つの異なることが進行中であり、その用語は互換性がない:
MyClass myClassyReference
new MyClass()
=
。事実を再言する:
参照型変数は、単に「参照」とも呼ばれます。「値型変数」はリファレンスではありません。
これは、「objectAはオブジェクトのインスタンスです」は重大な誤りです。objectAが「objectBのインスタンス」である場合、objectAは、objectBのタイプ(つまり、何であれ)と現在の状態-何であれ、人生を始める必要があります。オブジェクトBが変更されたときにオブジェクトD、E、およびFを作成する場合 いやいや!「objectAはクラスのインスタンス」の概念的および技術的なケースです。「インスタンス化」と「インスタンス」は正確な意味を持っています-オブジェクトはクラスから型、定義、値を取得します。
MyClass myClassyReference = null
通常、「変数はnullに割り当てられている」とは言わず、「変数がnullを参照している」とは言いません。代わりに、「変数はnullです」と言います。または「変数が何も参照していない」、または「参照がnullです」
実用的なアプリケーション:
コードを指で叩いて、「このインスタンスには無効なプロパティがあります。多分それがループが失敗した理由です。インスタンス化中にパラメーターを検証する必要があります。」(つまり、コンストラクターの引数)。
私はあなたのコードでこれを見ます、
MyClass myClassyReference;
myClassyReference.DoSomething();
「変数を宣言しましたが、割り当てませんでした。それはnullであるため、何も参照していません。そのため、メソッド呼び出しが例外をスローします。」
編集を終了
参照型の変数の名前と値が独立して存在しています。そして、私は独立したという意味です。
インスタンス化オブジェクトは、またはそれへの参照を持っていない可能性があります。
インスタンス化されたオブジェクトは、それへの多くの参照を有することができます。
Aは、宣言された基準又はてもしなくてもよいを指しているオブジェクト。
変数は値で初期化されます。オブジェクトはメモリがそれのために割り当てられ、それのコンストラクタが実行されたときにインスタンス化されます。
たとえば、ここに変数があります:
Dim obj as Object
この変数は初期化されていません。obj
変数に値を割り当てると、変数が初期化されます。次に初期化の例を示します。
obj = 1
obj = "foo"
インスタンス化は非常に異なるものですが、通常はインスタンス化の後に初期化が続くため、関連しています。
Dim obj As New Object()
前のコード行では、インスタンス化された新しいobj
変数への参照を使用して変数が初期化されています。私たちは新しいがあると言う、我々はそれの新しいインスタンスを作成しているので、インスタンス化されました。Object
Object
上記のコードで割り当てが行われていることが明確でないため、VB.NETはこれをC#よりもはるかに混乱させると思います。C#では、インスタンスのインスタンス化と変数の初期化の両方があることはより明確です。
Object obj = new Object();
何かを初期化するとは、初期値に設定することです。何かをインスタンス化するには、そのインスタンスを作成します。
多くの場合、これはほぼ同じです。この:
SqlConnection conn = new SqlConnection();
インスタンス化SqlConnection
オブジェクトを、そして初期化しconn
、そのインスタンスに設定することにより変数。
オブジェクトのコンストラクターもオブジェクトのプロパティをデフォルト値に設定するため、オブジェクトをインスタンス化すると初期化されると言うのは正しいことです。(誤解を招くかもしれませんが、オブジェクトがインスタンス化された後、それを初期化するために明示的に呼び出さなければならないメソッドをオブジェクトが公開する場合、時々そうです)。
インスタンス化とは、オブジェクトのインスタンスが作成されたことを意味します。開始済みとは、同じオブジェクトが何らかの初期化を行ったことを意味します。
クラスまたはオブジェクトをインスタンス化すると、その新しいインスタンスが作成されるか、インスタンスを「保持」するためにメモリが割り当てられます。そのオブジェクトの初期化は、インスタンス化中に実行される指示になります。
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."
他の人が違いを説明したので、詳細には触れません。ただし、インスタンス化によってオブジェクトが適切に初期化されない場合があります。オブジェクトをインスタンス化するときは、いくつかのデータで初期化します。クラス/タイプには初期化ロジックがありますが、インスタンス化ロジックは通常、new
キーワードによって実行されます(基本的にメモリ割り当て、参照コピーなど)。しかし、インスタンス化は必ずしもオブジェクトの有効な状態をもたらす必要はありません。つまり、オブジェクトが初期化されていないと言えます。これは、オブジェクトをインスタンス化できるが初期化できない実用的な例です(たとえばC#で申し訳ありません)。
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
そこでコンストラクタを呼び出してオブジェクトをインスタンス化しません(ただし、内部の魔法がいくつかあります)。
また、値の型はインスタンス化されず、初期化のみが可能であると主張することもできます。これは、新しい割り当てが必要ない場合でもnew..
、インスタンス化の定義次第です。