UI畫面上的CheckBox勾選狀態,可以用一個Int32變數記憶32種變化,處理這種Bit值一般會用到System.Collections.BitArray類別,它其實是List<bool>的代名詞,可以配置成任意長的陣列長度,記憶體空間是bool(1-byte) * N(長度)。要節省整體記憶體的耗損,底層核心可以使用System.Collections.Specialized.BitVector32類別替代,不過些Bitwise操作類別通常是用完即丟的性質,因此在此我們暫時不考慮記憶體優化的問題,而使用BitArray來承接多個Int32變數的連接運算。
由於BitArray類別是可以任意變化長度的,但裏頭的函式很陽春,若只想抽取某陣列局部的Bits,或從讀取一個Int32變數置放其陣列的某些元素,都得自己處理,而且BitArray陣列沒有直接輸出成Int32值的函式,網路上有使用BitArray.CopyTo()的範例,卻有可能在處理byte等小長度的時候超出陣列範圍。
為了避免每次處理這些冗煩的需求,我寫了一個FixedBitArray類別來優化.NET下的BitArray,它能提供陣列操作時長度超出的問題(透過Capacity的指定),而且能讀取任一Int32值來改變自己的陣列元素值。這Helper類別本身沒啥特別技術含量,但在處理Bits陣列的操作非常便利。
要使用FixedBitArray來記憶UI中的多個CheckBox控制項勾選狀況,若用array[0] = true/false位置法不僅難以記憶且容易混洧,最好的方式是使用Enum列舉的項目,這些列舉項目會自動對號入座,不僅在程式上易於閱讀,也很方便維護。
如此一來,透過一些程式設計巧思及Enum列舉型別,將底層二進位的Bit位元技術,結合Mapping到上層UI控制項的呈現控制,相當有意思。
No comments:
Post a Comment