如何重用以下一次性资源代码呢?

 string text;

 using (var stream = new StreamReader(path))

 {

     text = stream.ReadToEnd();

 }

这时以传统的OOP风格来重构代码并不是一件容易的事。是可以使用模板方法模式来解决这个问题,但是该解决方案还会带来更多的复杂性,因为它需要新的基类和每个派生类的实现。更好、更优雅的解决方案是函数式编程, 即使用lambda表达式(匿名委托)。以下是实现静态辅助方法及其用法的代码:

R Using<T,R>(this T item, Func<T, R> func) where T : IDisposable { using (item)

return func(item);

string text = new StreamReader(path).Using(stream => stream.ReadToEnd());

以上代码实现了一种灵活且可重用的模式,以用于清理一次性资源。这里唯一的约束就是泛型类型T必须是实现IDisposable的类型。

《 .NET并发编程实战》实战习题集 - 4 - 如何重用一次性资源的更多相关文章

  1. Python并发编程之实战异步IO框架:asyncio 下篇(十一)

    大家好,并发编程 进入第十一章. 前面两节,我们讲了协程中的单任务和多任务 这节我们将通过一个小实战,来对这些内容进行巩固. 在实战中,将会用到以下知识点: 多线程的基本使用 Queue消息队列的使用 ...

  2. Java并发编程原理与实战三十三:同步容器与并发容器

    1.什么叫容器? ----->数组,对象,集合等等都是容器.   2.什么叫同步容器? ----->Vector,ArrayList,HashMap等等.   3.在多线程环境下,为什么不 ...

  3. Java并发编程原理与实战三十二:ForkJoin框架详解

    1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...

  4. Java并发编程原理与实战十五:手动实现一个可重入锁

     package com.roocon.thread.ta1; public class Sequence { private MyLock lock = new MyLock(); private ...

  5. Java并发编程原理与实战十四:Lock接口的认识和使用

    保证线程安全演进: synchronized volatile AtomicInteger Lock接口提供的方法: void lock():加锁 void unlock():解锁 void lock ...

  6. Java并发编程原理与实战十三:JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型:   package com.roocon.thread.t8; import java.util.concurren ...

  7. Java并发编程原理与实战十二:深入理解volatile原理与使用

    volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值. synchronized除了线程之间互 ...

  8. Java并发编程原理与实战十一:锁重入&自旋锁&死锁

    一.锁重入 package com.roocon.thread.t6; public class Demo { /* 当第一个线程A拿到当前实例锁后,进入a方法,那么,线程A还能拿到被当前实例所加锁的 ...

  9. Java并发编程原理与实战十:单例问题与线程安全性深入解析

    单例模式我想这个设计模式大家都很熟悉,如果不熟悉的可以看我写的设计模式系列然后再来看本文.单例模式通常可以分为:饿汉式和懒汉式,那么分别和线程安全是否有关呢? 一.饿汉式 先看代码: package ...

随机推荐

  1. maven 学习---生成基于Maven的项目文档站点

    在Maven中,可以使用“mvn site”,为您的项目信息生成文档站点. mvn site 生成的网站是在项目的“target/site”文件夹中. mvn site 示例 请参见通过“mvn si ...

  2. 考研辅助app的诞生!

    背景: 去年下半年由于种种因素驱动下,准备去考研,在之前同事的推荐下,参加了考研培训班,培训班发了纸质书籍和线上视频观看账号,由于线上视频需要全程联网才能观看,突发奇想,要是我把这些视频下载下来,没网 ...

  3. MQTT实战2 - 使用MQTTnet实现mqtt通信

    MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信 MQTT实战2 - 使用MQTTnet实现mqtt通信 源码下载 -> 提取码  QQ:505645074 MQTT ...

  4. 21个React开发神器

    摘要: React开发神器. 原文:22 Miraculous Tools for React Developers in 2019 译者:前端小智 下列工具中的重要性与排序无关. 1.Webpack ...

  5. linux的ftp操作

    1.查看是否安装 rpm -qa |grep vsftpd 没有输出,表示没有安装 2.查看服务状态 1).service vsftpd status 输出信息 vsftpd is stopped 表 ...

  6. 5. [mmc subsystem] mmc core(第五章)——card相关模块(mmc type card)

    零.说明(重要,需要先搞清楚概念有助于后面的理解) 1.mmc core card相关模块为对应card实现相应的操作,包括初始化操作.以及对应的总线操作集合.负责和对应card协议层相关的东西. 这 ...

  7. SpringMVC结果参数转换XSS攻击安全处理

    首先在sprigMvc的配置文件中配置返回结果集使用的类 <!-- 参数转码 --> <mvc:annotation-driven> <!-- 注册处理 JSON 的转换 ...

  8. Android中GridView的按下效果及selector的使用

    gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 详细说明:http://blog.csdn.net/songzhiyong112 ...

  9. 03-cmake语法-变量,字符串

    CMake的基本数据类型是字符串(不区分大小写),一组字符串在一起称为列表(list). 条件判断中的取值情况如下表: 真 1, ON, YES, TRUE, Y, 非0的数  假 0, OFF, N ...

  10. BZOJ 4491: 我也不知道题目名字是什么 线段树+离线

    code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...