close

1.結構宣告內不能初始化欄位(宣告時直接指定值)
,除非將其宣告為 const 或 static。
初始化要在建構子中完成。
若 struct 中的變數還沒有進行初始化(指定值),也不能直接使用,要先初始化(指定值)才行

例:

public struct CoOrds
    {
        //錯誤,指定初值要在建構式中完成
        public int x=10, y=10;

        public const int z =8;//正確
        public static int q = 2;//正確

        public CoOrds(int p1, int p2)
        {
            x = p1;
            y = p2;
        }       
    }

調用結構的方法

//方法1.
CoOrds coo = new CoOrds();
Response.Write(coo.x);

//方法2.也可以不需要new
CoOrds coo2;
//但仍需初始化結構內的變數,否則為未賦值狀態,不可用
coo2.x = 10; 
Response.Write(CoOrds.x);

2.結構不可宣告預設建構函式(沒有參數的建構函式) 或解構函式。

例:

public struct CoOrds
    {
        public int x, y;       

        //錯誤,一定要有參數
        //public CoOrds()
        //{
        //}
 
        //正確
        public CoOrds(int p1, int p2)
        {
            x = p1;
            y = p2;
        }
    }

3.結構是在指派時複製的。當指派結構給新變數時,就會複製所有資料,
而新變數所做的任何修改都不會變更原始複本的資料
在使用如 Dictionary<string, myStruct> 的實際型別集合時,請務必謹記這一點。

4.結構為實值型別,而類別則是參考型別。

5.與類別不同的是,結構並不需要使用 new 運算子就能具現化。
使用了new仍然是分配在Stack上

可以選擇是否要用 new 建立一個新的結構,
差別在於使用 new 會執行結構中建構式初始化內部的變數,
不使用 new 的話,則要自己進行初始化的工作。
但因不會有建構函式呼叫,會使得配置更有效率

例:

//假設有一結構如下
public struct CoOrds
    {
        public int x, y;
        public CoOrds(int p1, int p2)
        {
            x = p1;
            y = p2;
        }       
    }

調用結構的方法

//方法1.
CoOrds coo = new CoOrds();
Response.Write(coo.x);

//方法2.也可以不需要new
CoOrds coo2;
//但仍需初始化結構內的變數,否則為未賦值狀態,不可用
coo2.x = 10; 
Response.Write(CoOrds.x);

ps.MSDN上new運算子那篇提到

為 struct 宣告預設建構函式會發生錯誤,因為每一個實值型別都有隱含的公用預設建構函式。

 可以在結構型別上宣告參數化的建構函式以設定其初始值,但只有在需要預設值以外的其他值時,才必須這麼做。

像結構這樣的實值型別物件是建立於堆疊上,而像類別這樣的參考型別則是建立在堆積上。

 兩種物件型別都會自動終結,但是依據實值型別的物件會在超出範圍時終結,

而依據參考型別的物件則會在移除最後一個參考之後終結。

 對於消耗固定資源 (例如,大量記憶體、檔案控制代碼或網路連線) 的參考型別,有時最好採用決定性的最終化,以確保儘速終結物件

如需詳細資訊,請參閱 using 陳述式 (C# 參考)



6.結構可以宣告含有參數的建構函式。

7.結構無法從另一個結構或類別繼承而來,且它不能成為類別的基底,是隱含的sealed類
所以在結構裡面不可使用,protected 與 internal protected 存取修飾子;
也不可以 用 abstrct, virtual

8.結構可實作介面,若是實作介面,也是使用 public 修飾子

例:
1.先定義一個介面

namespace A 
{
    internal interface Interface1
    {
        string MethodB();
    }
}

2.再來定義一個結構並且繼承介面

namespace A
{
    public struct StructTest : Interface1
    {
        public string MethodB() 
    {
            return "MethodB";
        }
    }
}

3.輸出結果

//建立結構物件
A.StructTest oStruct = new ClassLibrary1.ClassStructTest();
Console.WriteLine(oStruct.MethodB());       

9.所有結構都是從繼承自 System.Object 的 System.ValueType

10.結構可以用來當做可為 Null 的型別,而且可以對其指派 null 值。

類與結構比較整理如下:

結構
1.沒有預設建構子,但可以自己加
2.沒有解構子
3.没有 abstract 和 sealed(因為不能繼承)
4.不能用protected、internal protected修飾
5.可以不使用new初始化
6.初始化變數要在建構子中完成

類別
1.有預設的建構子
2.有解構子
3.可以用各種修飾符
4.必需使用new初始化

重點
1.Stack的空間有限,對於處理大量邏輯的對象,用類比結構好
2.結構表示如點、矩形和顏色這種輕量級的對象
3.在表現抽象和多級別的對象時,類比較好
4.大多數情況下當類只是一些數據時,結構較好

 

 

 

參考來源: https://gdfan1114.wordpress.com/2005/06/15/c-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%9805-struct-enum/ http://www.dotblogs.com.tw/atowngit/archive/2009/08/28/10292.aspx http://www.cftea.com/c/2008/03/JHB3MJM8DYGS0JJ9.asp http://msdn.microsoft.com/zh-tw/library/0taef578.aspx

http://msdn.microsoft.com/zh-tw/library/x9afc042.aspx

https://msdn.microsoft.com/zh-tw/library/fa0ab757.aspx

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小豆干 的頭像
    小豆干

    小豆干就是我唷

    小豆干 發表在 痞客邦 留言(0) 人氣()