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

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

     

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

【.NET深呼吸】应用上下文(AppContext)的更多相关文章

  1. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  2. 【Flask源码分析——请求上下文与应用上下文】

    Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...

  3. Hasor:生命周期

    首先引用Wiki的介绍一下Hasor:     “Hasor是一款开源框架.它是为了解决企业模块化开发中复杂性而创建的.Hasor遵循简单的依赖.单一职责,在开发多模块企业项目中更加有调理.然而Has ...

  4. python Flask web框架

    目录: --> Flask --> 配置文件 --> 配置文件解析 --> 配置文件导入 --> 路由 --> 路由参数 --> 常用路由匹配 --> ...

  5. DAY5-Flask项目

    1.验证参数(WTForms): 当URL为/book/search?q= &page=1 时 ,p=空格,验证器会通过,在forms验证层的book.py文件中添加DataRequired验 ...

  6. Android应用程序窗体设计框架介绍

    在Android系统中,一个Activity相应一个应用程序窗体.不论什么一个Activity的启动都是由AMS服务和应用程序进程相互配合来完毕的.AMS服务统一调度系统中全部进程的Activity启 ...

  7. 浅谈flask源码之请求过程

    更新时间:2018年07月26日 09:51:36   作者:Dear.   我要评论   这篇文章主要介绍了浅谈flask源码之请求过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...

  8. Flask中本地栈的使用

    4种上下文变量 承接上一篇内容.当一个请求到来时,除了request被封装成全局变量之外,还有三个变量也是同样被封装成全局变量,那就是current_app.g.session.上面4个变量之所以能够 ...

  9. 【.NET深呼吸】基于异步上下文的本地变量(AsyncLocal)

    在开始吹牛之前,老周说两个故事. 第一个故事是关于最近某些别有用心的人攻击.net的事,其实我们不用管它们,只要咱们知道自己是.net爱好者就行了,咱们就是因为热爱.net才会选择它.这些人在这段时间 ...

随机推荐

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. .NET 4.6.2正式发布带来众多特性

    虽然大多数人的注意力都集中在.NET Core上,但与原来的.NET Framework相关的工作还在继续..NET Framework 4.6.2正式版已于近日发布,其重点是安全和WinForms/ ...

  3. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  4. Vue-Router 页面正在加载特效

    Vue-Router 页面正在加载特效 如果你在使用 Vue.js 和 Vue-Router 开发单页面应用.因为每个页面都是一个 Vue 组件,你需要从服务器端请求数据,然后再让 Vue 引擎来渲染 ...

  5. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  6. 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...

  7. AJAX操作数据

    本文使用AJAX访问数据库文件,并显示在网页中.另外还有AJAX对数据库的删除操作,网页不加载,只刷新数据. 随意使用数据库中的一张表: 使用AJAX显示表中内容,首先打入body代码: <h1 ...

  8. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  9. 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率

    原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...

  10. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...