“不要反复刑满释放对象”的小小说

缘起

人家都说康奈尔笔记法,很好用吗,能抵抗遗忘曲线,让你的笔记事半功倍,有趣味的校友自行百度哈。

网上有诸多现成的模版,下载下来之后吧,看着近乎在下面写英文可能更利于一点,行距很小,而且还有网址在地点,心里不是很乐意的说吧。后来想着自己在word或者excel里面做一个模板出来,后来愣是不会把一个表格的一条龙设置成占总表格的70%,最后扬弃,后来想起来,css里面是能够用cm做单位的呀,为啥不友善写一个啊,只用div就可以了呀

经过翻阅MSDN中的CA2202(链接在文后),我们可以查到原因是这般的,“某个方法实现所蕴含的代码路径可能引致对同样对象往往调用
IDisposable.Dispose 或与 Dispose 等效的点子(例如,用于某些项目的Close()方法)”,MSDN中从来交给了化解格局就是无须关闭StreamReader,而是一贯关闭FileStream。

实现

  1. 先把一个div设置成A4纸的大大小小,宽21cm,高29.7cm

        <div id="abody">
        </div>
    

    #abody { width: 21cm; height: 29.7cm; margin: 0 auto; overflow: hidden; padding: 1.5cm 1.2cm 1.2cm 2.5cm;}
    
  2. 给A4纸这么大的div里面加四个转移的div,一个往左,占用29%的上空,一个往右,占用68%的上空

    <div id="main" class="main le">
            <div class="aline">提示</div>
            <div class="aline"></div>
    </div>
    <div id="sider" class="main ri">
            <div class="aline">笔记</div>
            <div class="aline"></div>
    
    </div>
    <div id="footer" class="footer">
    
            <div class="aline doubleline">概要</div>
            <div class="aline"></div>
    </div>
    

    用css的border分开两栏图片 1

    .main {height: 75%; overflow: hidden;}
    
        .le { width: 28.99999%; border-right: double 3px #666; float: left; }
        .ri { width: 69.99999%; float: right; }
    
  3. 往大框里面写一行一行的横线,用一个div 的aline类实现,html见下边

    此间假使您的编辑器协理emmet的话,写一个div.aline*42,就会有42行相同的div出现了。然后用css的border属性画出一条条的线出来。

    .aline { height: 0.9cm; border-bottom: 1px; border-bottom-style: dashed; border-bottom-color: #999; 
                margin-right: 8px; color: #eee; line-height: 0.9cm;}
    
  4. 再在左右四个大框的末尾放一个div,清除浮动,放概要有些。

    <div id="main" class="main le">
            <div class="aline">提示</div>
            <div class="aline"></div>
    </div>
    <div id="sider" class="main ri">
            <div class="aline">笔记</div>
            <div class="aline"></div>
    
    </div>
    <div id="footer" class="footer">
    
            <div class="aline doubleline">概要</div>
            <div class="aline"></div>
    </div>
    

    ,里面的首行,用实线分出来5R笔记的下一些结构来

    .footer {clear: both; overflow: hidden;}
    .doubleline { border-top: double 3px #666;}
    
  5. 就如此,很粗略的哈

    再见2017,你好,2018。
    想拿着直接打印着用的话,在此地https://files.cnblogs.com/files/nimeiz/0011.pdf

但是这两种代码假诺应用代码分析会出现哪些动静吧,如下图。

下一场我们用Reflector找到Stream里德(Reade)r的实现(在mscorlib.dll文件中)如下:

只是,为何MSDN的例子给的是关闭流而不是关门读取器呢?

 

读书了网上也不曾找到权威的材料,所以个人统计了几点如下仅供参考:

【题外话】

1、关闭StreamReader等其实早就关门了其BaseStream,但容易使开发者误以为BaseStream没有停歇而后续运用导致抛出异常,所以关闭最基础的流会更好些。

有道是有人会写如下的代码吧,为了释放资源,我们把开拓的东西都关门掉,貌似没有什么问题。

 1 FileStream fs = null;
 2 StreamReader sr = null;
 3 
 4 try
 5 {
 6     fs = new FileStream(@"F:\test.txt", FileMode.Open, FileAccess.Read);
 7     sr = new StreamReader(fs);
 8 
 9     String content = sr.ReadToEnd();
10 }
11 finally
12 {
13     if (sr != null)
14     {
15         sr.Close();
16     }
17 
18     if (fs != null)
19     {
20         fs.Close();
21     }
22 }

当然,喜欢用using的同校也可能会写如下的代码:

【作品索引】

图片 2

MSDN给出的措施为啥要这么做吗?出于好奇心,首先拿上述的代码单步调试一下:

StreamReader在履行Close时竟然执行了this.stream(BaseStream)的Close,然后将BaseStream再指向null,那就迎刃而解了事先为何指示不要频繁放出
一个
对象,其实是Stream里德(Reade)r的Close已经放出了一回而已。当然,不仅仅是StreamReader是这样子,StreamWriter、Binary里德(Reade)r等等也都是这样子的。

【三、相关链接】

在推行完Stream里德r的Close之后,StreamReader的BaseStream指向了null,同时fs也变为了无法读取,但fs不是null。

 

 

1、CA2202:不要频繁放出对象:http://msdn.microsoft.com/zh-cn/library/ms182334(v=vs.110).aspx

  1. 题材和解决方法
  2. 干什么这么去做
  3. 连带链接

相比较有意思的是,这里指示的是“不应对一个目的往往调用
Dispose”,为啥会是“一个对象”呢?

事先大部分刻钟都在用Visual Studio
2008做开发,即使也点开过代码分析,但是一看一大串内容,尤其是一大串针对命名的指出,就决然关闭了。本次见习使用的Visual
Studio
2012,发现代码分析默认去掉了累累内容,呈现的也都是相比根本并索要改正的地点,所以也都认真研究了刹那间。

 1 public override void Close()
 2 {
 3     this.Dispose(true);
 4 }
 5 
 6 protected override void Dispose(bool disposing)
 7 {
 8     try
 9     {
10         if ((this.Closable && disposing) && (this.stream != null))
11         {
12             this.stream.Close();
13         }
14     }
15     finally
16     {
17         if (this.Closable && (this.stream != null))
18         {
19             this.stream = null;
20             this.encoding = null;
21             this.decoder = null;
22             this.byteBuffer = null;
23             this.charBuffer = null;
24             this.charPos = 0;
25             this.charLen = 0;
26             base.Dispose(disposing);
27         }
28     }
29 }

 

【二、为何如此去做】

1 using (FileStream fs = new FileStream(@"F:\test.txt", FileMode.Open, FileAccess.Read))
2 {
3     using (StreamReader sr = new StreamReader(fs))
4     {
5         String content = sr.ReadToEnd();
6     }
7 }

2、StreamReader等我并从未采用非托管的内容,所以也无需积极履行Close,让GC去做就好了。

图片 3

【一、问题和解决模式】