• 【.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。

    运行后的结果如下图所示。

         

    最后,还得跟大伙说一声,中秋节别吃太多月饼,三高食品。

  • 相关阅读:
    php计算utf8字符串长度
    php和js字符串的acsii码函数
    快速排序的php实现
    bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数
    bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
    bzoj 4173 打表???
    bzoj [Noi2002]Savage 扩展欧几里得
    bzoj 3505 [Cqoi2014]数三角形 组合
    bzoj 2820 莫比乌斯反演
    Travel 并查集
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4840505.html
Copyright © 2020-2023  润新知