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

 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. 深入理解枚举属性与for-in和for-of

    首先要分清什么是可枚举属性,什么是不可枚举属性 1.可枚举属性 在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被f ...

  2. 汇编指令之STOS、REP

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明.23:28:13,23:28:19作者By-----溺心与沉浮----博客园 STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的 ...

  3. 网页跳H5实例

    public static void CheckAgent() { string redirect = string.Empty; string agent = HttpContext.Current ...

  4. Django ajax 检测用户名是否已被注册

    添加一个 register.html 页面 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  5. [TCP/IP] SSL的通讯原理

    SSL:位于传输层和应用层之间,专门实现在传输之前加密,在接收端给应用层之前解密;使用非对称加密技术 SSL原理 1.客户端与服务端建立连接 2.互相Hello(包含支持的版本.算法:加上随机数) 3 ...

  6. Visual Studio的UTF-8问题

    参考:https://www.jianshu.com/p/c51cbb2f20e1 一.在“工具”菜单找到“自定义”,然后按照图示操作. 二.选择“编码”.

  7. 201871010133-赵永军《面向对象程序设计(java)》第十三周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871010136-赵艳强《面向对象程序设计(java)》第十五周学习总结

    201871010136-赵艳强<面向对象程序设计JAVA>第十五周实验总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这 ...

  9. 创建war类型项目(六)

    1. 创建maven project时选择packaging为war: 2. 在webapp文件夹下新建META-INF和WEB-INF/web.xml web.xml模板 <?xml vers ...

  10. Gym101667 H. Rock Paper Scissors

    将第二个字符串改成能赢对方时对方的字符并倒序后,字符串匹配就是卷积的过程. 那么就枚举字符做三次卷积即可. #include <bits/stdc++.h> struct Complex ...