【.NET深呼吸】應用上下文(AppContext)


在.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。

 

運行后的結果如下圖所示。

     

 

 

最后,還得跟大伙說一聲,中秋節別吃太多月餅,三高食品。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM