'挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute'

EMS 編譯器 程序員 數學 軟謀net 2019-08-29
"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

上次看到的代碼邏輯就這樣了,不過畢竟在一個團隊裡面,水平參差不齊,用純數字來&,|,^,最起碼不是那麼容易理解的,如果

配上枚舉的話,可能就更完美了。

說起枚舉,其實就是編譯器給我們的語法糖,本質上來說就是一個繼承在Enum類型下的一個個const字段,既然是const,那

就天生具備(+,-,* ,/ ^,| &)這樣常規的數學運算。

舉個例子:

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

上次看到的代碼邏輯就這樣了,不過畢竟在一個團隊裡面,水平參差不齊,用純數字來&,|,^,最起碼不是那麼容易理解的,如果

配上枚舉的話,可能就更完美了。

說起枚舉,其實就是編譯器給我們的語法糖,本質上來說就是一個繼承在Enum類型下的一個個const字段,既然是const,那

就天生具備(+,-,* ,/ ^,| &)這樣常規的數學運算。

舉個例子:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

然後看看上面的Enum生成的IL代碼。

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

上次看到的代碼邏輯就這樣了,不過畢竟在一個團隊裡面,水平參差不齊,用純數字來&,|,^,最起碼不是那麼容易理解的,如果

配上枚舉的話,可能就更完美了。

說起枚舉,其實就是編譯器給我們的語法糖,本質上來說就是一個繼承在Enum類型下的一個個const字段,既然是const,那

就天生具備(+,-,* ,/ ^,| &)這樣常規的數學運算。

舉個例子:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

然後看看上面的Enum生成的IL代碼。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

可能有人會問,這裡的“uint8” 是怎麼回事,其實這個就是隱藏到枚舉類型後面的真實的基元類型,可以用GetUnderlyingType來獲取。

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

上次看到的代碼邏輯就這樣了,不過畢竟在一個團隊裡面,水平參差不齊,用純數字來&,|,^,最起碼不是那麼容易理解的,如果

配上枚舉的話,可能就更完美了。

說起枚舉,其實就是編譯器給我們的語法糖,本質上來說就是一個繼承在Enum類型下的一個個const字段,既然是const,那

就天生具備(+,-,* ,/ ^,| &)這樣常規的數學運算。

舉個例子:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

然後看看上面的Enum生成的IL代碼。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

可能有人會問,這裡的“uint8” 是怎麼回事,其實這個就是隱藏到枚舉類型後面的真實的基元類型,可以用GetUnderlyingType來獲取。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

通常情況下,枚舉只能顯示一個狀態,那麼如果讓枚舉顯示多個狀態,這個時候就可以用FlagAttribute來標記,讓標誌位來處理枚舉,

來做強大的組合功能。

舉個例子:從圖中航班政策返回的17的數字來看,我們知道Airport和CND是可用的,如果用了FlagAttribute標記後,這次我們不用擔

心,直接將17轉化為枚舉即可。

"

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用

來隱藏或者開啟界面的相關配送方式,如果大家訂過機票可能知道配送方式有很多種,比如“無需打印行程單(PJN)”,“機場自取(Airport)”,

“市內配送(CND)”,“快遞(EMS)”等等。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

根據上面的邏輯就可以知道,配送方式是有兩種狀態,可用與不可用,在邏輯實現上,很容易就想到了bit位,每一個位代表一個配送方式,

0表示不可用,1表示可用,所以航班接口只要給一個數字就行了,我只需要判斷bit位中哪些是1就行了。

比如用8位byte字段為例:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中可以看到,快遞(EMS)是不可用的,那麼怎麼判斷呢,其實也就17&32就ok了,如果為32,則說明可用,為0則不可用,其他

的判斷可以用同樣的手段。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

上次看到的代碼邏輯就這樣了,不過畢竟在一個團隊裡面,水平參差不齊,用純數字來&,|,^,最起碼不是那麼容易理解的,如果

配上枚舉的話,可能就更完美了。

說起枚舉,其實就是編譯器給我們的語法糖,本質上來說就是一個繼承在Enum類型下的一個個const字段,既然是const,那

就天生具備(+,-,* ,/ ^,| &)這樣常規的數學運算。

舉個例子:

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

然後看看上面的Enum生成的IL代碼。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

可能有人會問,這裡的“uint8” 是怎麼回事,其實這個就是隱藏到枚舉類型後面的真實的基元類型,可以用GetUnderlyingType來獲取。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

通常情況下,枚舉只能顯示一個狀態,那麼如果讓枚舉顯示多個狀態,這個時候就可以用FlagAttribute來標記,讓標誌位來處理枚舉,

來做強大的組合功能。

舉個例子:從圖中航班政策返回的17的數字來看,我們知道Airport和CND是可用的,如果用了FlagAttribute標記後,這次我們不用擔

心,直接將17轉化為枚舉即可。

挖一挖C#中那些我們不常用的東西之系列(5)——FlagAttribute

從圖中看到,經過枚舉轉換後,可能對程序員的理解以及記錄log上面,更方便分析和追蹤。

"

相關推薦

推薦中...