程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 從模擬字符串型的枚舉說起(1)

從模擬字符串型的枚舉說起(1)

編輯:關於C語言

1. 有字符串型的枚舉嗎?

UK 在《關於枚舉的種種》中提到這樣一個問題:

枚舉的成員類型都是數值型的,如果想做一個字符型的枚舉有什麼辦法?

enum colors : string{
    red='#ff0000',

  }

在展開討論之前,我認為有必要搞清楚另一個問題,上面代碼中的 '#ff0000' 不是字符而是字符串,應改成 "#ff0000",於是,UK 的問題也順利成章地改成“想做一個字符串型的枚舉有什麼辦法”了。

很坦白地說,.Net 並不支持這樣的字符串型枚舉。另外,也不是所有的數值類型都能作為枚舉的底層類型,枚舉的底層類型只能是整數類型,這意味著某天你想定義一個底層類型為 double 的枚舉,你將會收到編譯器的警告信。

UK 的代碼確實提出了這樣一種需求,colors 就像一個枚舉,但其成員的值是一個字符串,於是,我們很容易產生這樣一個疑問:是否能夠模擬出這樣一個枚舉呢?

2. 有辦法模擬出來嗎?

在寫任何代碼之前,讓我們首先思考一下,假如真有這樣一個 Color 類,我們會怎樣使用它?以下是我想到的兩個用法:

1// Code #01
2
3Color c1 = Color.Red;
4string s1 = (string)c1;
5Debug.Assert(s1 == "#FF0000");
6
7Color c2 = (Color)"#00FF00";
8Debug.Assert(c2 == Color.Green);

首先,枚舉是通過其成員而不是構造函數來初始化的,正如上面代碼的第三行。於是,我們應該把構造函數設為私有,同時模擬一些枚舉成員並暴露出來:

// Code #02

public class Color
{
  private Color(string value)
  {
    m_Value = value;
  }

  private string m_Value;

  public static readonly Color Red = new Color("#FF0000");
  public static readonly Color Green = new Color("#00FF00");
  public static readonly Color Blue = new Color("#0000FF");
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved