為結構定義函數與為類定義函數完全相同。
許多方面可以把結構看作是縮小的類。它們基本上與類相同,但是更適合於把一些數據組合起來的場合,它們與類的區別在於
結構是值類型
雖然結構是值類型,但在語法上常常可以把他們當作類來處理。
注意,因為結構是值類型,new運算符並不分配堆中的內存,而是調用相應的構造函數,根據傳送給它的參數,初始化所有字段。也可以這樣寫:
如果Dimentions是一個類就會產生編譯錯誤。但對於結構,變量聲明實際上是為整個結構分配堆棧中的空間,所以就可以賦值了。
結構遵循其他數據類型都遵循的規則:在使用前所有的元素都必須進行初始化。在結構上調用new運算符,或者給所有的字段分別賦值,結構就完全初始化了(如果結構定義為類的成員字段,在初始化包含對象時,結構就會自動初始化為0)。
結構是值類型,所以會影響性能。正面影響是為結構分配內存時速度非常快。被刪除時也很快。負面影響是把結構作為參數來傳遞或者把一個結構賦給另一結構時會有性能上的損失。結構主要用於小的數據結構,但當把結構作為參數傳遞給方法時,就應該把它作為ref參數傳遞,以避免性能損失。
結構和繼承
結構不是為繼承設計的。不能從一個結構中繼承,唯一的例外是結構(和其他C#類型一樣)派生於類System.Object。因此結構也可以訪問System.Object的方法。在結構中甚至可以重寫System.Object中的方法。結構的繼承鏈是每個結構派生於System.ValueType,System.ValueType派生於System.Object。不能為結構提供其他基類:每個結構都派生於ValueType。
結構的構造函數
為結構定義構造函數的方式與為類定義構造函數的方式相同,但不允許定義無參數的構造函數。默認構造函數把所有字段都初始化為0,且總是隱式的給出,即使提供了其他帶參數的構造函數也是如此。也不能提供字段的初始值,以此繞過默認構造函數。
部分類
partial關鍵字允許把類,結構或接口放在多個文件中。有時多個開發人員需要訪問同一個類,或者某種類型的代碼生成器生成了一個類的某部分,所以把類放在多個文件中是有益的。
partial class TheBigClass
...{
public void MethodOne()
...{
}
}
partial class TheBigClass
...{
public void MethodTwo()
...{
}
}
編譯包含這兩個源文件的項目時,會創建一個TheBigClass類,它有MethodOne()和MethodTwo()兩個方法。
如果聲明類時使用了下面的關鍵字,這些關鍵字將應用於同一個類的所有部分:
在嵌套的類型中,只要partial關鍵字位於class關鍵字的前面,就可以嵌套部分類。在把部分類編譯到類型中時,會合並屬性、XML注釋、接口、泛型類型的參數屬性和成員。
[CustomAttribute]
partial class TheBigClass : TheBigBaseClass, IBigClass
...{
public void MethodOne()
...{
}
}
[AnotherAttribute]
partial class TheBigClass : IOhterBigClass
...{
public void MethodTwo()
...{
}
}
編譯後,源文件變成:
[CustomAttribute]
[AnotherAttribute]
partial class TheBigClass : TheBigClass , IBigClass, IOhterBigClass
...{
public void MethodOne()
...{
}
public void MethodTwo()
...{
}
}
靜態類
如果類只包含靜態的方法和屬性,該類就是靜態類。靜態類在功能上與使用私有靜態構造函數創建的類相同。不能創建靜態類的實例。
static class Test
...{
public static void Method()
...{
}
}
使用類型名即克進行方法的調用。
Test.Method();
Object類
所有的.Net類都派生於System.Object。如果在定義類時沒有指定基類,編譯器就會自動假定這個類派生於Object。它的重要性在於,除了類自己定義的方法和屬性外,還可以訪問為Object定義的許多公共或受保護的成員方法。