none
Sturcture 中能否有 ArrayList RRS feed

  • 問題

  • 請問:

    若定義一個 Structure, 其中的元素能否是 Arraylist,如下所示:

        Structure MSStateStruct
            Dim TextID As String
            Dim Value As ArrayList
        End Structure

    若可以的話,在應如何使用?

    Dim MSStateInfo As New MSStateStruct
    MSStateInfo.Value.Add(1)
    MSStateInfo.Value.Add(2)

    會出現 {"並未將物件參考設定為物件的執行個體。"} 的錯誤訊息。 請問應如何修改,謝謝~~

    2014年12月1日 上午 03:05

解答

  •  你可以這樣用

     Dim MSStateInfo As New MSStateStruct
            MSStateInfo.Value = New ArrayList()
            MSStateInfo.Value.Add(1)
            MSStateInfo.Value.Add(2)

    但是:

    (1) 基本上我認為用 Class 定義會比 Structure 好

    結構和類別 (Visual Basic)

    尤其是在你的問題點上 "結構變數宣告無法指定初始設定式或陣列的初始大小;而類別變數宣告則可以。"

    (2) 用 List(of T) 會比 ArrayList 好, 因為 List(of T) 是強型別的, 尤其你的 ArrayList 包的是 Int32 (實質型別), 無可避免在操作時會出現大量的 Boxing 與 UnBoxing


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年12月1日 上午 03:32
    版主
  • 1. 選擇 Structure 就是希望輕量化,但看你的使用方式,我也覺得 Class 會比較好。
    2. 個人比較不建議直接對屬性進行操作,會額外透過方法來公開存取介面,例如:

    void Main()
    {
    	Test t = new Test();
    	t.AddNumber(1);
    	t.AddNumber(2);
    }
    
    public class Test
    {
    	private ArrayList Foo = new ArrayList();
    	
    	public void AddNumber(int n)
    	{
    		Foo.Add(n);
    	}
    }

    3. 真的要使用 Structure ,那就請瞭解它:http://msdn.microsoft.com/zh-tw/library/0taef578.aspx

    4. 請考慮使用改用泛型集合:http://msdn.microsoft.com/zh-tw/library/bb762916%28v=vs.110%29.aspx


    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    • 已提議為解答 No.18MVP 2014年12月1日 上午 05:41
    • 已標示為解答 璉璉Moderator 2014年12月6日 上午 08:53
    2014年12月1日 上午 03:46

所有回覆

  •  你可以這樣用

     Dim MSStateInfo As New MSStateStruct
            MSStateInfo.Value = New ArrayList()
            MSStateInfo.Value.Add(1)
            MSStateInfo.Value.Add(2)

    但是:

    (1) 基本上我認為用 Class 定義會比 Structure 好

    結構和類別 (Visual Basic)

    尤其是在你的問題點上 "結構變數宣告無法指定初始設定式或陣列的初始大小;而類別變數宣告則可以。"

    (2) 用 List(of T) 會比 ArrayList 好, 因為 List(of T) 是強型別的, 尤其你的 ArrayList 包的是 Int32 (實質型別), 無可避免在操作時會出現大量的 Boxing 與 UnBoxing


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年12月1日 上午 03:32
    版主
  • 1. 選擇 Structure 就是希望輕量化,但看你的使用方式,我也覺得 Class 會比較好。
    2. 個人比較不建議直接對屬性進行操作,會額外透過方法來公開存取介面,例如:

    void Main()
    {
    	Test t = new Test();
    	t.AddNumber(1);
    	t.AddNumber(2);
    }
    
    public class Test
    {
    	private ArrayList Foo = new ArrayList();
    	
    	public void AddNumber(int n)
    	{
    		Foo.Add(n);
    	}
    }

    3. 真的要使用 Structure ,那就請瞭解它:http://msdn.microsoft.com/zh-tw/library/0taef578.aspx

    4. 請考慮使用改用泛型集合:http://msdn.microsoft.com/zh-tw/library/bb762916%28v=vs.110%29.aspx


    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    • 已提議為解答 No.18MVP 2014年12月1日 上午 05:41
    • 已標示為解答 璉璉Moderator 2014年12月6日 上午 08:53
    2014年12月1日 上午 03:46
  • .Net 的參考型別用在結構裡,記憶體部分是指標,所以結構內實體只有 8 bytes ,再參考到遠程。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?


    2014年12月1日 下午 12:55