2009-08-01 143 views
1

在下面的代碼塊中,爲什麼我需要在類中聲明myData,然後在構造函數中初始化myData = new string [size]?爲什麼編寫私有字符串[] myData = new string [size]是非法的?C#構造函數幫助

也就是說,爲什麼我需要做的:

class IntIndexer 
{ 
    private string[] myData; 

    public IntIndexer(int size) 
    { 
     myData = new string[size]; 

     for (int i = 0; i < size; i++) 
     { 
      myData[i] = "empty"; 
     } 
    } 
} 

而不是

class IntIndexer 
{ 
    private string[] myData = new string[size]; 

    public IntIndexer(int size) 
    {  
     for (int i = 0; i < size; i++) 
     { 
      myData[i] = "empty"; 
     } 
    } 
} 
+1

你能澄清這個問題嗎?你在問爲什麼成員變量必須在函數範圍之外聲明,或者你發現你的構造函數沒有按預期工作? – 2009-08-01 15:47:52

回答

9

因爲變量 「大小」 僅在構造函數中存在。

+2

這基本上回答了這個問題,但ShuggyCoUk的答案更好,因爲它解釋了爲什麼'大小'不會總是被知道。 – weiqure 2009-08-01 16:45:57

2

因爲size是構造函數的參數,只存在於構造函數的作用域內。

5

因爲size只有構造函數在運行時 - 不是編譯時。如果你想大小myData到一定的大小 - 即在編譯時已經知道,那麼你可以做到這一點的聲明:

private string[] myData = new string[1000]; 

private const int DATA_SIZE = 1000; 

private string[] myData = new string[DATA_SIZE]; 
1

因爲你不知道大小直到構造函數被調用。下面的字段定義是好的:

private string[] myData = new string[100]; 
6

因爲你不知道會是什麼大小,或者即使它存在於構造函數之外。

內聯初始化程序作爲的所有構造函數的一部分運行。如果添加了另一個沒有大小的構造函數,會導致課程中斷,這是一個令人困惑的事情。

此外,即使編譯器做得足夠聰明以檢查所有這些,這將是一個混淆範圍濫用。如果在課堂上的其他地方有一個叫做「大小」的恆定字段呢?

所有這些都是爲什麼不試圖允許這種事情的原因,它有寶貴的小好處,所以爲什麼打擾。

1

出於以下原因,您無法這麼做:編譯器如何知道編譯時的大小?

如果要初始化一個具有運行時變量大小的數組,則必須在變量具有值時將其初始化爲運行時方法!

+1

恩。即使您指定常量,所有數組也會在運行時初始化。使用一個變量(作用域爲對象,而不是構造函數)是完全合法的,儘管它沒有預期的效果,除非變量在數組初始化之前被初始化。 – tvanfosson 2009-08-01 16:03:53

2

這裏的問題是範圍之一。您不能在構造函數之外引用size(構造函數的參數),因爲它沒有在構造函數之外定義。這會給你一個編譯錯誤。如果變量是在對象中定義的,那麼這將是完全合法的,但是您將依賴於初始化的順序,以確定您是否會獲得預期的效果。如果變量的初始化器在數組的初始化器之前運行,那麼它可能工作。國際海事組織,你最好在構造函數中進行初始化,因爲這樣你可以定義執行順序並知道什麼時候會發生。

0

因爲如果試圖以這種方式

類IntIndexer

{

私人的String [] myData的=新的字符串[大小]做的;

public IntIndexer(int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     myData[i] = "empty"; 
    } 
} 

}

你會得到編譯錯誤 名稱「大小」不存在當前上下文存在。

因此在這一點上 私人字符串[] myData = new string [size];大小尚未宣佈。

如果你會以這種方式寫下你從中可以得到尺寸的價值作爲你的目標,我認爲這會讓它更具靈活性,並讓實例爲你做到這一點,這就是爲什麼你的目標可以通過這個

class IntIndexer { private string [] myData;

public IntIndexer(int size) 
{ 
    myData = new string[size]; 

    for (int i = 0; i < size; i++) 
    { 
     myData[i] = "empty"; 
    } 
} 

}

即你將其尺寸被設置這樣

IntIndexer實例=新IntIndexer(100);