2016-10-11 154 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類(我希望我在這裏正確使用'object'和'class'這個詞)。但是,爲什麼隨後需要將myString分配給New StringBuilder?我不是用Dim創建一個StringBuilder嗎?在這個例子中New運算符的作用是什麼?

任何有助於我理解的解釋是非常感謝。

+1

_Dim的StringBuilder作爲StringBuilder_宣告一個StringBuilder實例的引用不存在的,直到你打電話給New。 New在內存中的某處創建實例,並將_reference_返回到實例所在的內存區域。 – Steve

+0

PS我在發佈之前發現了這個討論,但不幸的是它沒有具體解決我的問題。 http://stackoverflow.com/questions/467843/vb-net-dim-vs-new –

+0

該行確實**兩個**事物:'Dim'聲明代碼將使用變量'myString',這將是類型'StringBuilder'。 'New'創建一個可以使用的'StringBuilder'實例。 – Plutonix

回答

1

Dim myString as StringBuilder 

聲明,是爲了引用StringBuilder實例變量。在您調用New之前,該實例不存在。 New在內存中的某個位置創建實例,並將引用返回到該實例所在的內存區域。

讓我們試着檢查一下這條線。
當編寫

Dim myString as StringBuilder = New StringBuilder 

(您也可以使用昏暗的myString =新的StringBuilder(),編譯器可以識別變量的從上下文的類型)

你是把在同一行這兩個指令

Dim myString As StringBuilder 
myString = New StringBuilder 

在第一行,你聲明要引用StringBuilder實例,但是,在這一點上的變量,該變量(想想它作爲內存中的4個字節的區域)不包含任何內容。該變量的值沒有被分配到任何東西,你可以用

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

證明這一點現在,你叫新的StringBuilder算誰的搜索內存的區域有足夠的空間來存儲所有的內部字段是StringBuilder實例的一部分,在創建這個區域之後,New運算符調用StringBuilder類的無參數構造函數(應該初始化內部字段爲所需內容)並返回指向分配給內存區域的值StringBuilder實例。正是這個值(參考),他們會被分配給您的myString變量,現在沒有更多的沒有

myString = New StringBuilder() 
b = myString Is Nothing 
Console.WriteLine(b) ' => outputs False 
0

這裏發生了什麼事,你做一個快捷方式:

Dim myString As StringBuilder 
myString = new StringBuilder() 

所以它不需要被分配一個新的StringBuilder,因爲你已經完成了任務。

現在Console.WriteLine命令應該是myString.ToString(),像

Console.WriteLine (myString.ToString()) 

這將StringBuilder對象轉換爲字符串。

+0

注意'()'在調用構造函數和函數時更好(在c#中是必需的,請參見圖)。另外,'ToString()'函數將StringBuilder對象中的字符串聚合爲一個字符串並返回它 - 無*轉換* – djv

0

字符串生成器是一個類。

當您執行Dim myString as StringBuilder時,您正在創建一個變量,即內存空間,該變量將指向實例的內存中的位置StringBuilder

無論你什麼時候Dim東西,它的值都將是該類的默認值。對於大多數類,默認值爲空,儘管ValueType如Integer和Boolean具有其他默認值(整型爲0,布爾型爲false)

當您做= New StringBuilder時,您正在實例化StringBuilder類的對象,現在你的變量myString指向內存中的那個地方。

如果您省略此步驟,myString.Append("-")將拋出NullPointerException,因爲myString爲null。

Dim myString As StringBuilder = New StringBuilder是做一個簡單的方法:

Dim myString As StringBuilder 
myString = New StringBuilder