【.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。
运行后的结果如下图所示。

最后,还得跟大伙说一声,中秋节别吃太多月饼,三高食品。
【.NET深呼吸】应用上下文(AppContext)的更多相关文章
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- 【Flask源码分析——请求上下文与应用上下文】
Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...
- Hasor:生命周期
首先引用Wiki的介绍一下Hasor: “Hasor是一款开源框架.它是为了解决企业模块化开发中复杂性而创建的.Hasor遵循简单的依赖.单一职责,在开发多模块企业项目中更加有调理.然而Has ...
- python Flask web框架
目录: --> Flask --> 配置文件 --> 配置文件解析 --> 配置文件导入 --> 路由 --> 路由参数 --> 常用路由匹配 --> ...
- DAY5-Flask项目
1.验证参数(WTForms): 当URL为/book/search?q= &page=1 时 ,p=空格,验证器会通过,在forms验证层的book.py文件中添加DataRequired验 ...
- Android应用程序窗体设计框架介绍
在Android系统中,一个Activity相应一个应用程序窗体.不论什么一个Activity的启动都是由AMS服务和应用程序进程相互配合来完毕的.AMS服务统一调度系统中全部进程的Activity启 ...
- 浅谈flask源码之请求过程
更新时间:2018年07月26日 09:51:36 作者:Dear. 我要评论 这篇文章主要介绍了浅谈flask源码之请求过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...
- Flask中本地栈的使用
4种上下文变量 承接上一篇内容.当一个请求到来时,除了request被封装成全局变量之外,还有三个变量也是同样被封装成全局变量,那就是current_app.g.session.上面4个变量之所以能够 ...
- 【.NET深呼吸】基于异步上下文的本地变量(AsyncLocal)
在开始吹牛之前,老周说两个故事. 第一个故事是关于最近某些别有用心的人攻击.net的事,其实我们不用管它们,只要咱们知道自己是.net爱好者就行了,咱们就是因为热爱.net才会选择它.这些人在这段时间 ...
随机推荐
- TODO:即将开发的第一个小程序
TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...
- Android调用微信登陆、分享、支付
前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...
- jQuery之Deferred源码剖析
一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- dagger2系列之Scope
Dagger的Scope注解代表的是作用域,通过实现自定义@Scope注解,标记当前生成对象的使用范围,标识一个类型的注射器只实例化一次,在同一个作用域内,只会生成一个实例, 然后在此作用域内共用一个 ...
- C#中将DataTable导出为HTML的方法
今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...
- Android listview和gridview以及view的区别
GridView 可以指定显示的条目的列数. listview一般显示的条目的列数都是一列 如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView andr ...
- 万向节锁(Gimbal Lock)的理解
[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...
- FineReport如何用JDBC连接阿里云ADS数据库
在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...