C#编程语言(六):枚举类型与结构类型
枚舉類型
枚舉類型(也稱為枚舉)為定義一組可以賦給變量的命名整數(shù)常量提供了一種有效的方法。 例如,假設(shè)您必須定義一個變量,該變量的值表示一周中的一天。 該變量只能存儲七個有意義的值。
若要定義這些值,可以使用枚舉類型。枚舉類型是使用 enum 關(guān)鍵字聲明的。
?
enumDays { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };如果未在枚舉數(shù)列表中指定元素的值,則值將自動按 1 遞增。 在前面的示例中,Days.Sunday 的值為 0,Days.Monday 的值為 1,依此類推。創(chuàng)建新的 Days 對象時,如果不顯式為其賦值,則它將具有默認值 Days.Sunday (0)。 創(chuàng)建枚舉時,應(yīng)選擇最合理的默認值并賦給它一個零值。 這便使得只要在創(chuàng)建枚舉時未為其顯式賦值,則所創(chuàng)建的全部枚舉都將具有該默認值。
使用枚舉的好處:
明確為客戶端代碼指定哪些值是變量的有效值。
在 Visual Studio 中,IntelliSense 列出定義的值。
可以將任意值賦給枚舉類型的枚舉數(shù)列表中的元素,也可以使用計算值:
?
enum MachineState{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
} 控件枚舉的底層存儲
默認情況下,C#保存枚舉值的數(shù)據(jù)類型是System.Int32(int)。當然我們可以按環(huán)境的需要做改變。如程序用在低內(nèi)存的設(shè)備中時,為了省內(nèi)存我們使用byte類型:
?
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };聲明和使用枚舉
設(shè)定了枚舉范圍和存儲類型后,就可以使用它代替所謂的幻數(shù)(看不出意義的常數(shù)數(shù)值)了。枚舉是自定義類型,我們可以使用枚舉作為局部變量,方法參數(shù),方法返回值等。
System.Enum 類
為枚舉提供基類。.NET枚舉從System.Enum類獲得了很多功能,Enum類定義了許多查詢和轉(zhuǎn)換某個枚舉的方法。
Enum 類型公開的部分核心成員:
GetName 在指定枚舉中檢索具有指定值的常數(shù)的名稱。
?GetNames 檢索指定枚舉中常數(shù)名稱的數(shù)組。
GetType: 獲取當前實例的 Type。
GetUnderlyingType?:返回指定枚舉的基礎(chǔ)類型。
ToString() 將此實例的值轉(zhuǎn)換為其等效的字符串表示形式。
GetValues?檢索指定枚舉中常數(shù)值的數(shù)組。?
Parse(Type, String) 將一個或多個枚舉常數(shù)的名稱或數(shù)字值的字符串表示轉(zhuǎn)換成等效的枚舉對象。
結(jié)構(gòu)類型
結(jié)構(gòu)類型是一種值類型,通常用來封裝小型相關(guān)變量組,例如,矩形的坐標或庫存商品的特征。結(jié)構(gòu)類型很適合在應(yīng)用程序中對數(shù)學(xué)、幾何及其他“原子”實體建模。結(jié)構(gòu)(和枚舉相似)是自定義類型,但不止是一組名稱/值對。結(jié)構(gòu)可以包括許多數(shù)字字段與操作這些字段的成員的類型。
注意:
1.結(jié)構(gòu)可以包含構(gòu)造函數(shù)、常量、字段、方法、屬性、索引器、運算符、事件和嵌套類型,但如果同時需要上述幾種成員,則應(yīng)當考慮改為使用類作為類型。
2.結(jié)構(gòu)可以實現(xiàn)接口,但它們無法繼承另一個結(jié)構(gòu)(結(jié)構(gòu)是隱式sealed,是不可被繼承的)。因此,結(jié)構(gòu)成員無法聲明為 protected。
?
struct Point{
// Fields of the structure.
public int X;
public int Y;
// A custom constructor.
public Point(int XPos, int YPos)
{
X = XPos;
Y = YPos;
}
// Add 1 to the (X, Y) position.
public void Increment()
{
X++; Y++;
}
// Subtract 1 to the (X, Y) position.
public void Decrement()
{
X--; Y--;
}
// Display the current position.
public void Display()
{
Console.WriteLine("X = {0}, Y = {1}", X, Y);
}
}
使用結(jié)構(gòu)
?? ?一、創(chuàng)建一個結(jié)構(gòu)變量,在使用前為它的所有公共字段賦值。否則會受到編譯錯誤。
?
Point myPoint;myPoint.X = 349;
//myPoint.Y = 76; 缺少這個賦值,會收到編譯錯誤!
myPoint.Display();
?? ?二、使用new關(guān)鍵字創(chuàng)建結(jié)構(gòu)變量,它會調(diào)用結(jié)構(gòu)的默認構(gòu)造函數(shù),給公共字段賦默認值。
?
Point myPoint=new Point();//輸出 X=0,Y=0
myPoint.Display();
結(jié)構(gòu)類型與類類型的區(qū)別
?? ?結(jié)構(gòu)類型和類類型實際上都是創(chuàng)建對象的模版,每個對象都包含數(shù)據(jù),并提供了處理和訪問數(shù)據(jù)的方法。在語法上,非常相似,主要的區(qū)別:
一、定義使用的關(guān)鍵字不一樣,結(jié)構(gòu)使用struct而類類型使用class。
二、結(jié)構(gòu)是值類型的,而類類型是引用類型的。(注意:雖然結(jié)構(gòu)的初始化使用了new操作符,可是結(jié)構(gòu)對象依然分配在堆棧上,如果不使用new那么在初始化所有字段之前,字段將保持為未賦值狀態(tài),且對象不可用。)
三、結(jié)構(gòu)是無法從另外一個結(jié)構(gòu)或者類繼承,本身也不能被繼承(結(jié)構(gòu)是隱式sealed)。(注:雖然結(jié)構(gòu)不能被繼承,可是結(jié)構(gòu)能夠繼承接口,方式和類繼承接口一樣。)
四、結(jié)構(gòu)類型變量可以不使用new關(guān)鍵字初始化,而類類型的對象必須使用new初始化(靜態(tài)類除外)。
如何選擇結(jié)構(gòu)還是類
1.棧(stack)的空間有限,對于大量的邏輯的對象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些。
2.結(jié)構(gòu)類型很適合在應(yīng)用程序中對數(shù)學(xué)、幾何及其他輕量的“原子”實體建模。例如,如果聲明一個含有 1000 個點對象的數(shù)組,則將為引用每個對象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。
3.在表現(xiàn)抽象和多級別的對象層次時,類是最好的選擇。
4.大多數(shù)情況下該類型只是一些數(shù)據(jù)時,結(jié)構(gòu)時最佳的選擇。
?
轉(zhuǎn)載于:https://www.cnblogs.com/bruce-wong/archive/2011/03/01/1967104.html
總結(jié)
以上是生活随笔為你收集整理的C#编程语言(六):枚举类型与结构类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA每个初学者都应该搞懂的问题 还可
- 下一篇: 字符串移位包含