C#程式設計利器之二:結構與列舉(Structure and enumeration)
在上一篇文章中,介紹了類如何封裝程式中的物件.而實際中,出了類可以封裝物件外,結構和列舉也可以封裝一些物件,本文將著重介紹結構和列舉這兩個知識點的相關應用.
一. 結構(Structure)
什麼是結構(Structure)?在C#裡,Struct是一種值型別,通常用來封裝小型相關變數組,和類有很大的相似度.同類一樣,它不但可以包含不同資料型別資料。還可以包含複合型別(陣列,結構,DateTime等等)除了以名字/值方式出現還可以有屬性和方法,所以說結構是一種強大的複合型資料。
1. 使用類封裝物件的屬性
以圖書來作為示例來分析,圖書包括圖書編號,圖書名稱,圖書作者以及出售價格等.我們平時所通常都是使用類來封裝這些資訊,如下:
1/**////
2/// 圖書物件
3///
4public class Books
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
10}
2. 使用結構封裝物件的屬性
其實出了使用類來封裝,我們還可以使用結構來封裝,實現如下:
1/**////
2/// 使用結構封裝圖書資訊
3///
4public struct Book
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
10}
3. 結構可以定義構造方法
1/**////
2/// 使用結構封裝圖書資訊
3///
4public struct Book
5{
6 /**////
7 /// 可定義構造方法
8 ///
9 public Book()
10 {
11 //
12 }
13
14 public int bookId;
15 public string bookName;
16 public string bookAuthor;
17 public double bookPrice;
18}
4. 可以使用new進行初始化
1/**////
2/// 使用結構封裝圖書資訊
3///
4public struct Book
5{
6 /**//////
7 ///// 可定義構造方法
8 /////
9 //public Book()
10 //{
11 // //這裡需要注意,當結構中已有帶引數的構造方法時,則不能定義無引數的構造方法
12 //}
13
14 public Book(int id, string name, string author, double price)
15 {
16 bookId = id;
17 bookName = name;
18 bookAuthor = author;
19 bookPrice = price;
20 }
21 public int bookId;
22 public string bookName;
23 public string bookAuthor;
24 public double bookPrice;
25}
5. 結構可以實現介面
1/**////
2/// 介面
3///
4public interface IBook
5{
6 DataSet QueryAll();
7}
8
9/**////
10/// 結構實現介面
11///
12public struct BookComponent : IBook
13{
14 public DataSet QueryAll()
15 {
16 return null;
17 }
18}
6. 類和結構的區別
從上面可以看出,無論是使用類還是結構,都可以用來封裝物件的屬性.當然出了相同點外,兩者之間還是有很大的不同,大體如下:
型別:類是引用型別,結構是值型別.
繼承:類可繼承,結構不能繼承.結構不能繼承其他的結構和類,或是被用作其他結構或類的基類.
構造方法與析夠函式:結構可以定義構造方法,但不能定義析夠函式.類既可以定義構造方法,也可定義析夠函式.
物件建立:可以使用new進行初始化,或進行手工初始化.類和結構都可以.
結構與介面:結構可以實現一個或多個介面. 如上:public struct BookComponent:IBook{ //....}.
多型: 結構與介面之間是支援多型的.如上面的結構實現介面為例,多型:IBook book = new BookComponent();
二. 列舉(Enumeration)
什麼是列舉(Enumeration)?列舉可以理解為通過預定義列出所有值的識別符號來定義一個有序集合,這些值的次序和列舉說明中的識別符號的次序一致的. 通常用於定義一些不變的序列,如一年四個季節,一禮拜為七天等等. 可以通過enum來定義(這裡主要是針對C#語言的實現,其實在JAVA語言裡也是通過enum來定義).
1. 列舉的定義形式
修飾符 enum 列舉名
{
識別符號1,
識別符號2,
..........,
識別符號n
}
如下則為一個完整的列舉定義:
1/**////
2/// 技術方向
3///
4public enum TechnologyDirection
5{
6 CPlusPlus程式設計師,
7 Java程式設計師,
8 DotNet程式設計師,
9 架構設計師,
10 開發組長,
11 需求分析師
12}
2. 另類列舉定義(可以初始化值)
1==============以下為第一種定義方法==============
2/**////
3/// 季節
4///
5public enum Season
6{
7 SPRING, //春天
8 SUMMER, //夏天
9 AUTUMN, //秋天
10 WINTER //冬天
11}
12==============以下為第二種定義方法==============
13/**////
14/// 季節
15///
16public enum SeasonTwo
17{
18 SPRING = 0, //春天
19 SUMMER = 1, //夏天
20 AUTUMN = 2, //秋天
21 WINTER = 3 //冬天
22}
23=================TEST===================
24class Program
25{
26 static void Main(string[] args)
27 {
28 //以上兩種定義方法效果都一樣
29 Console.WriteLine(Season.AUTUMN);
30 Console.WriteLine(SeasonTwo.AUTUMN);
31 //執行結果都為:AUTUMN
32 }
33}
如果不初始化值則從0開始,實際上面兩種定義方式定義得到的都是一個效果.
3. 物件的形式實現
何為物件的形式實現呢? 其實這個很簡單,也就是將需要列舉的標識定義在物件裡,通過物件的特性將其封裝.詳細如下程式碼:
1public class SeasonOne
2{
3 public static readonly SeasonOne SPRING = new SeasonOne("春天");
4 public static readonly SeasonOne SUMMER = new SeasonOne("夏天");
5 public static readonly SeasonOne AUTUMN = new SeasonOne("秋天");
6 public static readonly SeasonOne WINTER = new SeasonOne("冬天");
7
8 public SeasonOne(string name)
9 {
10 this.name = name;
11 }
12
13 //成員
14 private string name;
15 public string Name
16 {
17 get { return name; }
18 set { name = value; }
19 }
20}
以上的形式實現很簡單, 不過好象已經偏離了"列舉(enum)",因為實現已經由列舉轉向為了類(class)物件來實現了.定義一成員屬性,通過構造方法初始化,在類裡定義需要列舉的只讀成員,通常不建議使用此方式來實現. 我們可以這樣來測試:
1class Program
2{
3 static void Main(string[] args)
4 {
5 Console.WriteLine(SeasonOne.AUTUMN.Name);
6 //執行結果:秋天
7 }
8}
4. Java中的列舉
在與C#語言一樣流行的JAVA中,列舉還存在著另類故事,作為一個物件導向的開發者或是既將成為物件導向的開發者的你,我想了解下另類語言的某些特性是有必要的.在JAVA中,列舉除了上面所介紹的相關功能外,還有其他的一些功能,下面將簡單的介紹下這些功能的應用.
列舉裡定義抽象方法,識別符號實現抽象方法
1enum Operator{
2 ADD {
3 public double calculate(double a,double b){
4 return a+b;
5 }
6 },
7 SUBSTRACT{
8 public double calculate(double a,double b){
9 return a-b;
10 }
11 },
12 MULTIPLY{
13 public double calculate(double a,double b){
14 return a*b;
15 }
16 },
17 DIVIDE{
18 public double calculate(double a,double b){
19 return a/b;
20 }
21 };
22 public abstract double calculate(double a,double b);
23}
列舉裡定義屬性欄位和構造方法
1enum Course{
2 COREJAVA("zhangsan"), //zhangsan學CoreJava
3 WEB("lisi"), //lisi學Web
4 EJB ("wangwu"); //wangwu學EJB
5
6 String name;
7 Course(String name){
8 this.name=name;
9 }
10 public String getName(){
11 return this.name;
12 }
13}
屬性欄位,構造方法及抽象方法並存
enum Course{
COREJAVA("zhangsan"){
public void study(){
System.out.println("Study Corejava");
}
},
WEB("lisi"){
public void study(){
System.out.println("Study Web");
}
},
EJB ("wangwu"){
public void study(){
System.out.println("Study EJB");
}
};
String teachName;
Course(String name){
this.teachName=name;
}
public String getName(){
return this.teachName;
}
public abstract void study();
}
三. .NET Framework中的列舉基類
在.NET Framework中列舉基類(Enum)是一抽象類,位於System名稱空間下,繼承了ValueType類和IComparable, IFormattable, IConvertible介面,這裡以一個簡單的文字編輯作為示例介紹下列舉在實際中的應用.
簡單文字編輯器示例執行圖如下:
從上圖很容易看出,此文字編輯器主要是用於設定字型樣式,其實在實現這個簡單文字編輯器的時候就是使用的字型樣式列舉(FontStyle),FontStyle的原始碼定義如下:
1// 摘要:
2// 指定應用到文字的字形資訊。
3[Flags]
4public enum FontStyle
5{}{
6 // 摘要:
7 // 普通文字。
8 Regular = 0,
9 //
10 // 摘要:
11 // 加粗文字。
12 Bold = 1,
13 //
14 // 摘要:
15 // 傾斜文字。
16 Italic = 2,
17 //
18 // 摘要:
19 // 帶下劃線的文字。
20 Underline = 4,
21 //
22 // 摘要:
23 // 中間有直線通過的文字。
24 Strikeout = 8,
25}
要實現上圖示的簡單文字編輯器很簡單,基本思路就是通過點選上面字型樣式設定功能鍵,設定編輯區域的文字字型樣式,這實現很簡單.在此,我就直接把程式碼貼出來,有不清楚之處可從下面我提供的示例程式碼下載連線下載本文示例程式碼檢視.
1private void SetStyle(object sender,EventArgs e)
2{}{
3 ToolStripButton btn = sender as ToolStripButton;
4 FontStyle. fontStyleContent = this.rchTxtContent.SelectionFont.Style;
5 FontStyle. BtnFont = ( FontStyle)(Enum.Parse(typeof(FontStyle),btn.Tag.ToString()));
6 if ((fontStyleContent | BtnFont) == fontStyleContent)
7 {
8 fontStyleContent = ~BtnFont & fontStyleContent;
9 }
10 else
11 {}{
12 fontStyleContent = fontStyleContent | BtnFont;
13 }
14 this.rchTxtContent.SelectionFont = new Font(this.rchTxtContent.SelectionFont.FontFamily,
15 this.rchTxtContent.SelectionFont.Size,
16 fontStyleContent,
17 this.rchTxtContent.SelectionFont.Unit);
18}
本文就介紹於此,更多請關注本系列後續文章,本文示例程式碼下載
注: 原創文章,轉載請註明出處: http://beniao.cnblogs.com/ 或 http://www.cnblogs.com/ 作者 : Beniao
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-598255/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c語言(列舉(enumeration)型別)C語言型別
- C# 列舉與位列舉概述C#
- 實驗6 C語言結構體、列舉應用程式設計C語言結構體程式設計
- 程式設計與演算法--(列舉-完美立方)程式設計演算法
- C#程式設計利器系列文章C#程式設計
- 實驗6_C語言結構體、列舉應用程式設計C語言結構體程式設計
- C#程式設計利器之一:類(Class)C#程式設計
- C#程式設計利器之三:介面(Interface)C#程式設計
- C#:列舉C#
- 重走JAVA程式設計之路(一)列舉Java程式設計
- 結構體,列舉,聯合結構體
- Partial類、列舉、結構體結構體
- 結對程式設計利器:SSH和Tmux程式設計UX
- PHP 列舉型別的管理與設計PHP型別
- 精通C#學習筆記---C#核心程式設計結構C#筆記程式設計
- 結構體-簡單列舉型別——植物與顏色結構體型別
- 程式結構&&程式設計程式設計
- 如何遍列 C# 列舉數的名稱與值C#
- perl 程式設計利器程式設計
- c#列舉轉換C#
- c語言程式設計學習之二維陣列C語言程式設計陣列
- c#列舉與陣列初始化及使用小記C#陣列
- 資料結構(C#):佇列資料結構C#佇列
- 結構、位域、聯合、列舉之小小總結
- 列舉python常用的資料結構Python資料結構
- matlab練習程式(結構張量structure tensor)MatlabStruct
- 認知列舉(C# Enum)C#
- Rust 程式設計影片教程對應講解內容-列舉型別與匹配Rust程式設計型別
- Rust程式設計與專案實戰-結構體Rust程式設計結構體
- Java基本程式設計結構Java程式設計
- 選擇結構程式設計程式設計
- 迴圈結構程式設計程式設計
- C#特性學習與使用(為列舉定義Description)C#
- C# 中的“智慧列舉”:如何在列舉中增加行為C#
- Rust 程式設計視訊教程對應講解內容-列舉型別與匹配Rust程式設計型別
- 列舉程式 (轉)
- C# 列舉常用方法淺析C#
- C#中實現列舉數C#