2016-10-11 19 views
0

初心者プログラマーとして、変数宣言の概念とVisual Basicでの値の割り当てを理解しようとしています。私は、チュートリアルのレッスンから、このコードを検討しています:変数宣言と代入

Imports System.Text 

Module Module1 

     Sub Main() 

      Dim myString As StringBuilder = New StringBuilder 

      For i = 1 To 10 
       myString.Append("-") 
       myString.Append(i) 
      Next 

      Console.WriteLine(myString) 
      Console.ReadLine() 

     End Sub 

End Module 

私の混乱はラインによるものです:

Dim myString As StringBuilder = New StringBuilder 

何が起こっていると思いますが、私は、新しいオブジェクトインスタンスとして変数のmyStringを宣言することですStringBuilderクラス(私はここで単語 'オブジェクト'と 'クラス'を正しく使用したいと思っています)。しかし、その後、なぜmyStringは新しいStringBuilderに割り当てられる必要がありますか?私はDimを使ってStringBuilderにしていませんでしたか?この例では、New演算子の役割は何ですか?

わかりやすい説明をいただければ幸いです。すでに割り当てを作ったので、だから、新しいStringBuilderのを割り当てるである必要はありません

Dim myString As StringBuilder 
myString = new StringBuilder() 

:ここ

+1

_DimのStringBuilderを使うまでは存在しないのStringBuilderインスタンスへの参照を宣言していないこと、あなたのmyString変数に代入されます。この値(...を参照)であることNewを呼び出します。 Newはメモリのどこかにインスタンスを作成し、そのインスタンスが存在するこのメモリ領域に_reference_を返します。 – Steve

+0

PS投稿する前にこのディスカッションを見つけましたが、残念ながら私の質問には特に言及しませんでした。 http://stackoverflow.com/questions/467843/vb-net-dim-vs-new –

+0

その行は** 2つの**ものを含みます: 'Dim'は、コードが変数myStringを使用することを宣言します。タイプStringBuilderの。 'New'は、使用可能な' StringBuilder'のインスタンスを作成します。 – Plutonix

答えて

1

Dim myString as StringBuilder 

ラインは、StringBuilderのインスタンスを参照するように意図されている変数を宣言します。そのインスタンスは、Newを呼び出すまで存在しません。 Newはメモリのどこかにインスタンスを作成し、そのインスタンスが存在するこのメモリ領域への参照を返します。

行を調べてみましょう。
あなたが

Dim myString as StringBuilder = New StringBuilder 

(あなたも薄暗いのmyString =新しいStringBuilderの()を使用することができ、コンパイラが文脈から変数の型を認識することができます)

を書くとき、あなたが1行に入れています最初の行で

Dim myString As StringBuilder 
myString = New StringBuilder 

2つの命令が、あなたはStringBuilderのインスタンスを参照する変数を宣言したが、この時点では、変数は(考えますそれはメモリ内の4バイトの領域として)は何も含んでいません。変数の値は、何にも割り当てられていない、あなたはすべての内部フィールドを格納するための十分なスペースがある場合さて、あなたはメモリの面積を検索新しいStringBuilderのオペレーターを呼び出す

Dim myString As StringBuilder 
Dim b As Boolean = False 
b = myString Is Nothing 
Console.WriteLine(b) ' => outputs True 

でそれを証明できるものこの領域を作成した後、New演算子はStringBuilderクラスのパラメータのないコンストラクタを呼び出します(これは、内部フィールドを必要なものに初期化することになっています)。RETURNSは、割り当てられたメモリの領域を示す値を返します。 StringBuilderインスタンス今はより多くの何も

がStringBuilder_として
myString = New StringBuilder() 
b = myString Is Nothing 
Console.WriteLine(b) ' => outputs False 
0

は何が起こったのです、あなたはへのショートカットをしました。

は今Console.WriteLineを文字列にStringBuilderオブジェクトに変換します

Console.WriteLine (myString.ToString()) 

このように、myString.ToString()でなければなりません。

+0

コンストラクタと関数を呼び出すときは、 '()'が望ましいことに注意してください(c#で必要です)。また、ToString()関数は、StringBuilderオブジェクトの文字列を単一の文字列に集約して返します - no * conversion * – djv

0

文字列ビルダーはクラスです。

Dim myString as StringBuilderを実行すると、インスタンス変数StringBuilderのメモリ内の場所を指す変数、つまりメモリ空間が作成されます。

Dim何かがあるときはいつでも、その値はそのクラスのデフォルト値になります。ほとんどのクラスでは、IntegerやBooleanなどのValueTypesには他のデフォルト値がありますが、デフォルト値はnullです(整数の場合は0、Booleanの場合はfalse)

= New StringBuilderを実行すると、StringBuilderクラスのオブジェクトをインスタンス化します。あなたの変数myStringはメモリ内のその場所を指しています。

この手順を省略すると、myString.Append("-")は、myStringがnullであるため、NullPointerExceptionをスローします。

Dim myString As StringBuilder = New StringBuilderを行うための簡単な方法です:

Dim myString As StringBuilder 
myString = New StringBuilder