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接口