在.net 4.6中新增了一個類,叫AppContext,這個家伙嘛,技術含量不算高,只不過是在編程的時候可以方便用用而已。應用上下文允許定義一個標識(用字符串表示),並且在應用程序運行期間可以切換狀態。相當於一個開關,有兩個狀態——true or false。
實際上我們自己也可以實現這樣的類,就是用一個static的字典來存儲存,key是開關標識,value是bool值。不過,要是.net庫里帶了這個東西,那就方便很多,至少我們也不用自己去實現。
AppContext類的所有成員都是靜態的,可見我上面的推斷不假。調用SetSwitch方法可以設置一個開關標識,以及標識的狀態。然后,在代碼的其他地方可以用TryGetSwitch方法來檢索某個開關標識的狀態。如果狀態打開,就執行A代碼,如果狀態關閉,就執行B代碼,如果狀態標識不存在,就執行C代碼。
這會讓我想到條件編譯,這個應用上下文,真的和條件編譯有着相似的地方,就是設定一個全局的標識符,然后在代碼各處可以進行標識符的判斷。但是,又跟條件編譯有所區別。條件編譯是某一部分代碼不參與編譯的,一旦改了條件就要重新編譯。而AppContext是在代碼本身完成的,所有代碼會參與編譯,只是在運行階段進行判斷。
舉個例子,假如我有個K程序,然后為K定義一個叫color的上下文標識。點擊窗口上的按鈕后,代碼會檢測這個color標識,如要標識處於打開狀態,就把橢圓填充為紅色;如果標識是關閉狀態,就把橢圓填充為灰色。
請看下面XAML:
<StackPanel Margin="12"> <CheckBox Content="應用上下文開關" Margin="3,9" Checked="OnChecked" Unchecked="OnUnchecked" /> <Button Margin="10,5" Content="填充橢圓" Click="OnClick" /> <Ellipse Width="160" Height="90" Name="elp" Stroke="Black" StrokeThickness="2" /> </StackPanel>
咱們就用CheckBox來選擇應用上下文標識是否開啟。
以下是CheckBox的事件代碼:
private void OnChecked(object sender, RoutedEventArgs e) { AppContext.SetSwitch("color", true); } private void OnUnchecked(object sender, RoutedEventArgs e) { AppContext.SetSwitch("color", false); }
以上代碼僅負責設置App Context的標識狀態。
下面代碼處理Button的事件:
private void OnClick(object sender, RoutedEventArgs e) { bool b; if (AppContext.TryGetSwitch("color", out b)) { _mBrush.Color = b ? Colors.Red : Colors.Gray; } else { _mBrush.Color = Colors.Transparent; } }
用TryGetSwitch方法可以獲取某個標識的狀態,狀態值存放在out參數中;如果某個標識不存在(未設置),整個方法會返回false。注意,TryGetSwitch方法的返回值不是標識的狀態值,請看方法原型:
static bool TryGetSwitch(string switchName, out bool isEnabled);
方法的返回值只是表明開關狀態能否獲取成功,而開關的狀態是由isEnabled參數來存放的,參數方向是out。
運行后的結果如下圖所示。
最后,還得跟大伙說一聲,中秋節別吃太多月餅,三高食品。