C# using垃圾回收详解
简介
语法
C# 语言参考
主要用途
作为语句
Fontfont2=newFont("Arial",10.0f);
using(font2)
{
//usefont2
}
//2.可以有多个对象与using语句一起使用,但是必须在using语句内部声明这些对象,如下所示:
using(Fontfont3=newFont("Arial",10.0f),font4=newFont("Arial",10.0f))
{
//Usefont3andfont4.
}
示例1
usingSystem;
classC:
IDisposable
{
publicvoidUseLimitedResource()
{
Console.WriteLine("Usinglimitedresource...");
}
voidIDisposable.Dispose()
{
Console.WriteLine("Disposinglimitedresource.");
}
}
classProgram
{
staticvoidMain()
{
using(Cc=newC())
{
c.UseLimitedResource();
}
Console.WriteLine("Nowoutsideusingstatement.");
Console.ReadLine();
}
}
作为指令
示例2
namespacePC
{
//Defineanaliasforthenestednamespace.
usingProject=PC.MyCompany.Project;
classA
{
voidM()
{
//Usethealias
Project.MyClassmc=newProject.MyClass();
}
}
namespaceMyCompany
{
namespaceProject
{
publicclassMyClass{}
}
}
}
.下面的示例显示了如何为类定义using指令和using别名:
//cs_using_directive2.cs
//Usingdirective.
usingSystem;
//Usingaliasforaclass.
usingAliasToMyClass=NameSpace1.MyClass;
namespaceNameSpace1
{
publicclassMyClass
{
publicoverridestringToString()
{
return"YouareinNameSpace1.MyClass";
}
}
}
namespaceNameSpace2
{
classMyClass
{
}
}
namespaceNameSpace3
{
//Usingdirective:
usingNameSpace1;
//Usingdirective:
usingNameSpace2;
classMainClass
{
staticvoidMain()
{
AliasToMyClasssomevar=newAliasToMyClass();
Console.WriteLine(somevar);
}
}
}
输出: You are in NameSpace1.MyClass
深入讨论
引言
引入命名空间
误区
namespace Boyspace
{
public class Player
{
public static void Play()
{
System.Console.WriteLine("Boys play football.");
}
}
}
namespace Girlspace
{
public class Player
{
public static void Play()
{
System.Console.WriteLine("Girls play violin.");
}
}
}
以using创建别名,有效的解决了这种可能的命名冲突,尽管我们可以通过类型全名称来加以区分,但是这显然不是最佳的解决方案,using使得这一问题迎刃而解,不费丝毫功夫,同时在编码规范上看来也更加的符合编码要求。
强制资源清理
using (Font f = new Font("Verdana", , FontStyle.Regular))
{
//执行文本绘制操作
Graphics g = e.Graphics;
Rectangle rect = new Rectangle(, , , );
g.DrawString("Try finally dispose font.", f, Brushes.Black, rect);
}//运行结束,释放f对象资源
在上述典型应用中,using语句在结束时会自动调用欲被清除对象的Dispose()方法。因此,该Font对象必须实现IDispose接口,才能使用using语句强制对象清理资源。我们查看其类型定义可知:
using(Pen p1 = new Pen(Brushes.Black), p2 = new Pen(Brushes.Blue))
{
//
}
否则,编译将不可通过。不过,还是有变通的办法来解决这一问题,原因就是应用using语句的类型必然实现了IDisposable接口,那么就可以以下面的方式来完成初始化操作,
using (IDisposable font = new Font("Verdana", , FontStyle.Regular), pen = new Pen(Brushes.Black))
{
float size = (font as Font).Size;
Brush brush = (pen as Pen).Brush;
}
另一种办法就是以使用try-finally来完成,不管初始化的对象类型是否一致。
Font f3 = new Font("Verdana", , FontStyle.Regular);
using (f3)
{
//执行文本绘制操作
}
结论
C# using垃圾回收详解的更多相关文章
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- 基于Python对象引用、可变性和垃圾回收详解
基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...
- python 垃圾回收详解
原文:https://zhuanlan.zhihu.com/p/31150408 总纲 策略和垃圾回收系统工作内容 引用计数详解 标记-清除+分代收集 循环引用 编程应用-常见方法 ex 过程详解 使 ...
- JVM垃圾回收详解
通常,我们在写java程序的时候,似乎很少关注内存分配和垃圾回收的问题.因为,这部分工作,JVM已经帮我们自动实现了. 这样看起来,好像很美好,但是任何事情都有两面性.虽然JVM会自动的进行垃圾回收, ...
- Python垃圾回收详解:引用计数+标记清理+分代回收
Python采用的是引用计数机制为主,标记-清理和分代收集两种机制为辅的策略. 1.引用计数 python中一切皆对象,所以python底层计数结构地就可以抽象为: 引用计数结构体{ 引用计数; 引用 ...
- 深入理解JVM虚拟机3:垃圾回收器详解
JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...
- .NET 垃圾回收浅解
在说明垃圾回收的实现机制之前,先说明一下垃圾回收存在的背景. 垃圾回收器(GC)是.NET平台中一个很重要的组成部分,.NET垃圾回收机制降低了编写程序的复杂程度,使程序员不用耗费精力去处理析构,成功 ...
- JVM 垃圾回收器详解
小结: 新生代 串行Serial 并行 Parallel(关注吞吐量) 并行ParNew 老年代 串行 Serial Old 并行Para ...
- JVM 的垃圾回收器详解
Parallel Scavenge(Paraller):Parallel Scavenge和ParNew关注的点不一样:ParNew关注的是尽可能缩短暂停的时间,Parallel Scavenge关注 ...
随机推荐
- PowerDesigner使用常见问题
1.在数据库生成表的时候,要求PowerDesigner中设计的表的Name的值要放到数据库中表的描述中,而不是PowerDesigner 中字段的Comment: 具体方法如下:首先将PowerDe ...
- UITableView 属性集合
UITableView-------表视图--继承UIScrollView并遵守NSCoding协议 属性 frame-------------设置控件的位置和大小 backgroundColor-- ...
- HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )
题意: 给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s, 要求字典序最小的答案 分析: 把字符串折半,分成0 - n/2-1 和 n/2 - n-1 d ...
- 判别linux机器字节序为大端还是小端
代码如下: #include <iostream> #include <arpa/inet.h> #include <cstdio> using namespace ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- MfC基础--绘图基础--win32
1.vc使用的控件分为三类: windows标准控件--MFC对这些进行了再封装 ActiveX 控件 其他MFC控件类 2.CWind是所有窗口的基类 3.GDI也属于一种API,主要用于绘图,(G ...
- [转发]Gulp开发教程(翻译)
Building With Gulp =================== 转载出处 原文地址 翻译出处 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的 ...
- 单片微机原理P3:80C51外部拓展系统
外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC. 0. IO接口电路概念与存储器拓展 1. 为什 ...
- discuz@功能的代码
//转载 $atlist = $atlist_tmp = $ateduids = array(); preg_match_all("/@([^\r\n]*?)\s/i", $mes ...
- Uubntu14.04 LST安装NodeJS
1:从官网下载node.js源码http://nodejs.org/download/ 当前最新版为node-v0.10.33 2:安装 $ tar zxvf node-v0.10.33.tar.gz ...