- 函数传参,对于基本数据类型C#使用值传递,对于Object使用引用传递,因为C# Object的存储是在堆中存对象的数据,在栈中放一个指向堆中数据的引用(指针)。所以可以认为C#的传参时栈中元素的传递。
- 默认参数
与C++一样,默认参数必须是最后的几个连续的参数
下图是不合法的。
与C++不同的是,
C#除了前两种方式,还支持第三种显示传递参数的调用方法。
3. Object创建过程与Constructor
先创建对象(分配空间),再调用CLR默认的构造函数(它会按上表初始化所有的类型),如果定义constructor,则调用该constructor,否则直接,
调用初始化语句初始化Object(即赋值语句,如int time = 300;)
上一篇中说到,class内声明的class,method,properties都是private,构造函数也不例外。所以构造函数传统的加上public。
初始化列表会先执行,比如下程序
调用
TestExp obj = new TestExp();
- obj.time的值会是300,而不是30。
4. Copy Constructor
C# 没有默认的copy Constructor, 必须手写
ICloneable实现浅拷贝。
实现接口ICloneable,返回值写为Object,返回自带的MemberwiseClone()
使用时,直接调用便好。
5. Destructor
C# 提供垃圾回收器(garbage collection),不许显示的销毁对象。
析构函数
显式调用是不合法的,只能在程序结束(而不是函数结束)时会默认调用,其实质是把析构函数中的代码合到基类Object.Finalize()中,并调用该函数。
构造函数,析构函数都不能被继承;析构函数还不能重载,只能有一个;
析构函数不能带修饰词或参数。
关于垃圾自动回收机制
.net垃圾收集器进行垃圾收集的四种时机
a.最常见的﹕当.net觉得合适时﹐例如它感到内存紧张了(朮语称为﹕0代对象充满)
b.微软强烈不建议使用的﹕GC的Collect方法调用(就是我们上面用的这种啦﹐因为会降低性能﹐会挂起进程, 等等﹐反正听微软的吧。当然某些时候可以用﹐
就像我上面用来测试的代码﹐呵呵...)
c.应用程序域卸载时(AppDomain)
d.CLR被关闭时(程序运行结束)
所以,如果一旦你使用完对象你就想调用解构器,你该怎么做?有两个方法:
调用垃圾搜集器(GC.Collect())来清理。
实现IDisposable的Dispose方法。
对于这两种方法参见http://www.cnblogs.com/paper/archive/2009/07/31/1535998.html
该博客中的程序说明,当调用构造函数时,会先调用父类的构造函数,而析构函数相反,这点与c++类似。
当出现不可用的对象(没有指针指向)时,并不会马上调用垃圾回收,因为他不满足上四点,但可通过显式调用GC.Collect(),来实现垃圾回收
using语句与IDisposable
参考http://www.csharpwin.com/csharpspace/151.shtml