大家好,我是武漢華師的SUNWEN.現在是五月四日中午,昨天一天由於在搞自己的技術網站,叫"鬼子山技術站",(嘿嘿,有點恐怖吧!)所以沒有寫.等這個站建好後,還要大家多多捧場啊,我們這個站主要是面向教育網的,因為服務器就在教育網內.
好了,言歸正傳.我要說的是C#中的結構(struct),注意,我在這裡說的結構不是指的C#的語言結構.這裡所說的是一種與類(class)相對的東西,下面我就與類相對比,來說一說這個struct.
下面的這個例子講述了如何建立一個具有屬性,方法和一個字段的結構.並講述如何使用他.
000: // Structs\struct1.cs 001: using System; 002: struct SimpleStruct 003: { 004: private int xval; 005: public int X 006: { 007: get { 008: return xval; 009: } 010: set { 011: if (value < 100) 012: xval = value; 013: } 014: } 015: public void DisplayX() 016: { 017: Console.WriteLine("The stored value is: {0}", xval); 018: } 019: } 020: 021: class TestClass 022: { 023: public static void Main() 024: { 025: SimpleStruct ss = new SimpleStruct(); 026: ss.X = 5; 027: ss.DisplayX(); 028: } 029: }
這個例子的輸出是:
The stored value is: 5
從上面的例子中我們可以看到結構和類似乎是一樣的.的確,如果你用類去重親寫這個程序,結果是一樣的.但是,很明顯,兩個一樣的東西是不可能一起出現的. 結構(struct)是值(value)型的,而類是參考型的.這樣,你就可以用結構建立像內建類型那樣的對象了.
還有就是如果你用一個new關鍵字建立一個類的實例的時候,它是以堆(heap)來分配的,而用new來建立一個結構的的實例的時候,它是以棧(stack)來分配.這會給我們提高很多性能(M$說的).好了,讓我們再來看下面的例子吧:
000: // Structs\struct2.cs 001: using System; 002: 003: class TheClass 004: { 005: public int x; 006: } 007: 008: struct TheStruct 009: { 010: public int x; 011: } 012: 013: class TestClass 014: { 015: public static void structtaker(TheStruct s) 016: { 017: s.x = 5; 018: } 019: public static void classtaker(TheClass c) 020: { 021: c.x = 5; 022: } 023: public static void Main() 024: { 025: TheStruct a = new TheStruct(); 026: TheClass b = new TheClass(); 027: a.x = 1; 028: b.x = 1; 029: structtaker(a); 030: classtaker(b); 031: Console.WriteLine("a.x = {0}", a.x); 032: Console.WriteLine("b.x = {0}", b.x); 033: } 034: }
這個例子的輸出是:
a.x = 1b.x = 5
從這個例子例子可以看出,當一個結構被傳遞到一個方法時,被傳遞的只不過是一個副本,而一個類被傳遞時,被傳遞的是一個參考.所以a.x=輸出的是1,不變,而b.x卻變了.
還有的區別就是結構可以不用new來實例化,而類卻要.如果你不用new來實例化一個結構,那麼所有的字段將仍然處於未分配狀態,直到所有的字段被初始化.和類一樣,結構可以執行接口.更重要的是,結構沒有繼承性,一個結構不能從別的類繼承,也不能是別的類的基類.
例三:
interface IImage { void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members }
好了,關於結構我就講到這了,以後還會講到的.