fengcarl

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

1.Disposable Objects

可删除对象的使用,新建的对象VariableName将在using这个程序段内有用,结束之后会自动删除该对象。

<ClassName> <VariableName> = new <ClassName>();

using (<variableName>)

{

}

或者

using(<ClassName> <VariableName> = new <ClassName>())

{

}

2.Class

internal(default):只有当前工程内可以使用

public:所有工程都可以使用

abstract:抽象类,可以和public一起使用,不能够实例化,但能被继承

sealed:不能被继承,能被实例化

每个类只能继承一个基类.如果你继承了一个抽象类,那么抽象类的所有成员必须被继承。

***public类不能继承internal类 internal类可以继承public类***

***继承基类必须跟在冒号后面,其后可以继承多个接口,接口中的成员必须要在支持的类中实现***

3.Interface

接口不能够实例化。 接口的名字一般以大写的I开头 例如 IHotDrink

一个类可以支持多个接口,一个接口可以用于多个类。

***接口有public和internal两种修饰,没有abstract和sealed.因为接口都是默认为抽象的***

4.Constructors&Destructors

构造函数系统默认添加,也可以自行添加,没有参数则对系统的默认构造函数进行了覆盖,有参数则进行了重载。

public修饰时表示 可以用该构造函数进行实例化。

private修饰时表示 不可以用该构造函数进行实例化。

eg.

class Myclass

{

public Myclass()

{

//default constructors code

}

~Myclass()

{

//destructor body

}

}

class Myclass

{

public Myclass(int myInt)

{

//NoneDefault constructors code.using myInt

}

}

构造函数的执行顺序问题,当类继承了基类时,构造函数的执行顺序是从基类开始构造。

使用base关键字,能够在子类中命名基类构造函数的参数。this关键字可以同时执行一个类中的两个构造函数。

***接口和抽象类的区别***

1)、派生类只能继承一个抽象类,但可以继承多个接口

2)、抽象类中可以有抽象成员和非抽象成员(可以用private等等修饰),接口成员都要在接口类中实现(必须用public修饰)

3)、接口中不能包含字段,构造函数,析构函数,静态成员和常量

 

5.Class与Struct 的区别

Class为引用类型,Struct为值类型

eg.

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace Ch09Ex03
 6 {
 7       class Myclass
 8       {
 9          public int val;
10       }
11       struct Mystruct
12       {
13           public int val;
14       }
15     class Program
16     {
17  
18         static void Main(string[] args)
19         {
20             Myclass objectA = new Myclass();
21             Myclass objectB = objectA;
22             objectA.val = 10;
23             objectB.val = 20;
24             Mystruct structA = new Mystruct();
25             Mystruct structB = new Mystruct();
26             structA.val = 30;
27             structB.val = 40;
28             Console.WriteLine("{0},{1},{2},{3}", objectA.val, objectB.val, structA.val, structB.val);
29             Console.ReadKey();
30         }
31     }
32 }

该程序的运行结果为20,20,30,40

不难理解class为引用类型,所以当将objectA复制给objectB是复制的是它的地址,此时两个类就联系在一起,在同一片地址上,所以修改其中任何一个,另外一个也会随之改变。 而Struct则因为它是值类型,所以拷贝不影响。

6.浅拷贝和深度拷贝

当一个类要拷贝另一个类时,一般情况下都会是把引用类型拷贝过来。 如果类中不含有引用类型,只含有一般的值类型,则通过浅拷贝,System.Object.MemberwiseClone 即可完成。

例如上例中 将拷贝改成 :

MyClass objectB = (Myclass)objectA.MemberwiseClone(); //此方法错误,因为MemberwiseClone()为保护成员,只能在类内定义另外一个public成员,调用该方法。

正确修改如下:

class Myclass
{
public int val;
public object getCopy()
{
return MemberwiseClone();
}
}

 Myclass objectB = (Myclass)objectA.getCopy();

如果类中含有引用成员,比如另外一个类,则必须要靠深度拷贝才能完成值的拷贝,深度拷贝依靠 ICloneable接口

posted on 2013-04-15 18:41  fengcarl  阅读(139)  评论(0编辑  收藏  举报