当前位置:
首页 > 编程开发 > Objective-C编程 >
-
C#教程之Beginner with c# 2
作者: kamphkb翻译 | ||
1。2 自动化的内存管理(automatic memory management) 手动管理内存需要程序员自行分配和释放内存块。这要求程序员有清晰的头脑和对整个运行过程有十分的 把握(好难!)。而c#把程序员从这难以承担的任务中解放出来。在多数的情况下,这种自动内存管理提 高代码的质量和程序员的生产力。并且,不会对程序的意图和执行产生幅面的影响(?俺可不相信m$的鬼 话)。不过,估计比java的回收站好一点吧。因为c#出道迟嘛(尽胡扯)。好了,来看看例子。*/ using system; public class stack { private node first = null; public bool empty { get { return (first == null); } } public object pop() { if (first == null) throw new exception("can't pop from an empty stack."); else { object temp = first.value; first = first.next; return temp; } } public void push(object o) { first = new node(o, first); } class node { public node next; public object value; public node(object value): this(value, null) {} public node(object value, node next) { next = next; value = value; } } } class test { static void main() { stack s = new stack(); for (int i = 0; i < 10; i++) s.push(i); while (!s.empty) console.writeline(s.pop()); } } /* stack类实现了一系列node的实例。大家可以看看stack类的push方法。node的实例就是在push方法中创建的。 就是“first = new node(o, first);”。请记住这个“new”噢。它就是用来创建类实例的。相关的语法太 多,遛到后面用一节详细讲。这里只是要了解自动内存管理(automatic memory management)好处?!“new” 是负责初始化类实例。而在c/c++中释放这些实例要用另一个关键字“delete”。但是在什么时候用delete呢, 这通常是很费神的活,老手也会阴沟里翻船。何况是俺呢!但在c#中有不用了。例子里就没有用“delete”。 当node的实例不需要时,垃圾收集器(garbage collector)自动销毁它,不用俺操心喽。这点到和java挺 像的(可能是抄的)。 在一个test类里,俺用了一个循环,对stack类的实例的push方法赋值十次。于是,push创建了node的十个实 例(instance)。然后用pop把它们显示出来。其顺序正好与创建的顺序相反。 这个例子相当的好,是stack 的一个典型,也很好的表述了自动内存管理的机制。但也不好懂,好在这一节不是写给毫无基础的网友看的。 俺自个都花了几分钟看明白,各位大虾更是没问题。 其实,当显示完了“10”以后,就会有一个node的实例符合被释放的条件,但垃圾收集器并不一定会这样做。 也就是说,它的行为并不确定(这和java一样,俺猜)。有时候,这种行为会带来一些负面影响。起码是性 能降低。自动内存管理本身也是有问题的。因为它很难管理一些特殊情况。有一些关于java的垃圾收集器的 文章也有提到。m$也不会好得了多少。所以,m$有个不安全代码的术语(unsafe code),用来为高级用户服 务。即,用户可以不采用垃圾收集器。但必须用“unsafe”关键字显式声明之。这样就避免了用户不经意以 外使用不安全代码。下面是一个例子:*/ using system; class test { unsafe static void writelocations(byte[] arr) { fixed (byte *p_arr = arr) { byte *p_elem = p_arr; for (int i = 0; i < arr.length; i++) { byte value = *p_elem; string addr = int.format((int) p_elem, "x"); console.writeline("arr[{0}] at 0x{1} is {2}", i, addr, value); p_elem++; } } } static void main() { byte[] arr = new byte[] {1, 2, 3, 4, 5}; writelocations(arr); } } /* 俺对这个例子不是很满意,也让俺有点迷惑,有机会再自己写一个。很简单,只是可以用指针了!万岁! 其实,俺对这一节最没有把握了!有不少地方都不能自圆其说!所以,请各位大虾大力批评。*/ |
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程