代码改变世界

C# note 04——class2

2015-04-06 11:08  yinglang  阅读(216)  评论(1编辑  收藏  举报
  1. 函数传参,对于基本数据类型C#使用值传递,对于Object使用引用传递,因为C# Object的存储是在堆中存对象的数据,在栈中放一个指向堆中数据的引用(指针)。所以可以认为C#的传参时栈中元素的传递。
  2. 默认参数

    与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