C 銳利體驗 第十四講 列舉

2021-03-31 08:56:28 字數 1530 閱讀 9699

第十四講 列舉

列舉型別是c#中又一種輕量級的值型別,c#用列舉來表達一組特定的值的集合行為,比如windows窗體可選的狀態,按鈕控制項的風格等。下面的程式偽碼展示了典型的列舉用法:

public enum writingstyle

class essay}}

注意上面的列舉符號classical,

modern,

elegant之間用逗號「,」而不是分號「;」來分隔。其中最後乙個列舉值elegant之後可以省去逗號分隔符。

和結構一樣,c#中的列舉不允許也有自己的繼承父類system.enum,同樣的,列舉不能被繼承,也沒有abstract一說。system.enum類為列舉型別提供了很多好用的功能操作。比如我們可以通過getname方法得到我們宣告列舉值的字串符號表示。下面的例子顯示了一些比較常用的操作:

using system;

public enum writingstyle

class test }

其中的最後一行輸出了system.int32,這是怎麼回事?我們知道int是system.int32的簡寫形式,難道我們的writingstyle列舉型別和整數int型別有什麼關係嗎?

是的,c#的列舉和整數值之間嚴格區分,比如我們就不能在上面的**中作dw=1類似的賦值。但每個列舉值卻的的確確都有乙個整數型別的數值相對應,而且可以轉換,只不過這種轉換必須用明晰的轉型語法來表達。我們知道在c#中整數型別有byte, sbyte, short, ushort, int, uint, long ,ulong共八種,那麼c#的列舉值對應的是哪一種整數型別呢?它關係到我們的列舉型別能夠容納的列舉值的數量。實際上c#列舉型別支援這八種整數型別的任何一種,根據我們的需要,可以在宣告列舉型別的時候來指定,如「public enum writingstyle :byte」就指定了它的列舉值的整數型別為byte。該型別可以通過上面所述的enum.getunderlyingtype方法來獲得。如果不明確指定,c#將預設採用int型別作為列舉數值的型別。既然列舉值實際上也是一種整數值,那麼它的大小呢?讀者將下面的**加在上面的main函式內,就可看到結果了。

foreach(object obj in enum.getvalues(typeof(writingstyle)))

上面的**將產生以下輸出:

classical : 0

modern : 1

elegant : 2

可以看到,c#預設地從0起為我們的列舉值賦了乙個隱含的值。當然,我們也可以自己為列舉值指定數值:

public enum writingstyle

我們甚至可以象下面這樣,前提是我們必須保證編譯時能夠計算出他們各自的數值。

public enum writingstyle

列舉值也擁有象整數那樣的比較,邏輯,算術等操作行為,看下面的例子:

using system;

public enum writingstyle

class test }

當計算出來的數值等於某個列舉值的實際大小,那麼顯示的是該列舉值的符號名稱,否則顯示的將是整數值。

第十四講 模組

1.模組 模組化指將乙個完整的程式分解成乙個個的小模組 通過將模組組合,來搭建出乙個完整的程式 模組化的優點 方便開發 方便維護 模組可以復用 模組的建立 在python當中乙個py檔案就是乙個模組 在乙個模組中引入外部模組 import模組名 模組名就是py檔案 可以引入同乙個模組多次,但是模組的...

MFC孫鑫第十四講UDP

srv include include void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 socket socksrv socket af inet,sock stream,0 socket socksrv socket...

機器學習基石第十四講筆記

lecture 14 regularization 規則化 14 1 規則化假說集 regularization the magic 從多次的hypothesis set走回到低次的hypothesis set,避免了overfit的發生。ill posed problems 指有很多的函式都滿足s...