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
留言列表