C#中的类定义:
c#使用class关键字来定义类:
class MyClass {}
默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它。可以使用internal访问修饰符关键字显示指定(这个是不必要的)。
internal class MyClass {}
指定类是公共的,要使用关键字public
public class MyClass {}
以这种方式声明的类不能是私有的或受保护的。
指定类是抽象的(不能实例化,只能继承,可以有抽象成员),可以是公共抽象类,也可以是内部抽象类
abstract class MyClass {}
指定类是密封的(sealed,不能继承),可以是公共密封类,也可以是内部密封类
sealed class MyClass {}
注意:在c#的类定义中,只能有一个基类,如果继承了一个抽象类,就必须实现继承的所有抽象成员(除非派生类也是抽象的)
编译器不允许派生类的可访问性高于基类。即内部类可以继承与一个公共基类,但是公共类不能继承与一个内部类。
public class MyBase {}
internal class MyClass :MyBase {}
如果没有使用基类,则被定义的类就只能继承于System.Object
除了以这种方式指定基类外,还可以在冒号之后指定支持的接口。如果指定了基类,它必须紧跟在冒号的后面,之后才是指定的接口。
如果没有指定基类,则接口就跟在冒号的后面。必须使用逗号分隔基类名(如果有基类)和接口名。
public class MyClass : MyBase , IMyInterface
public class MyClass : IMyInterface
可以指定多个接口
public class MyClass :MyBase, IMyInterface, IMySecondInterface
接口的定义:
声明接口的方式与声明类的方式相似,但是使用关键字是interface,而不是class
interface IMyInterface {}
访问修饰符关键字public和internal的使用方式相同的,与类一样,接口也默认定义为内部接口。所以要使用接口可以公开访问,必须使用关键字public关键字。
public interface IMyInterface {}
不能在接口中使用关键字abstract和sealed,因为这两个修饰符在接口定义中是没有意义的(它们不包含实现代码,所以不能直接实例化,且必须是可以继承的)。
接口的继承也可以用于类继承类似的方式指定。主要的区别是使用多个基接口。
public Interface IMyInterface : IMyBaseInterface, IMyBaseInterface2
接口不是类,所以没有继承System.Object
System.Object
所有的类都继承与System.Object
GetType()
以System.Type的对象的形式返回对象的类型
typeof()
可以把类名转化为System.Type对象。
构造函数和析构函数
在C#中定义类时,常常不需要定义相关的构造函数和析构函数,因为在建立代码时,如果没有提供它们,编译器会自动添加它们。
在.NET中使用的析构函数(由System.Object类提供)叫做Finalize(),但这不是我们用于声明析构函数的名称。
构造函数初始化器:它把代码放在方法定义的冒号后面。可以在派生类的构造函数定义中指定所使用的基类构造函数。
public MyClass(int i, int j):base(i)
除了base关键字外,这里还可以将另一个关键字this用作构造函数初始化器。
类库项目:
如果一个项目什么都不包含,只包含类(以及其他相关的类型定义,但没有入口点),该项目就称为类库。
类库项目编译为.dll程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容。这将扩展对象提供的封装性。
接口和抽象类
类似之处:
1.都包含可以由派生类继承的成员
2.都不能直接实例化
区别:
1.派生类只能继承一个基类,即只能直接继承一个抽象类(但可以用一个继承链包含多个抽象类)
类可以使用任意多个接口。只是采用接口的方式略有不同
2.抽象类可以拥有抽象成员(没有代码体)和非抽象成员(拥有代码体)
接口成员必须都在使用接口的类上实现(没有代码体)
3.接口成员是公共的
抽象类的成员可以是私有的、受保护的、内部的、或受保护的内部成员
4.接口不能包含字段、构造函数、析构函数、静态成员或常量
5.抽象类主要用作对象系列的基类,共享某些主要特性
接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。
结构类型:
结构是值类型,而类是引用类型。
浅度和深度复制:
浅度复制:通过MemberwiseClose()方法实现,没有考虑引用类型成员,新对象中的引用成员就会指向与源对象中相同成员的对象
深度复制:实现ICloneable接口,创建成员的新实例(复制值,而不是复制引用)
c#使用class关键字来定义类:
class MyClass {}
默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它。可以使用internal访问修饰符关键字显示指定(这个是不必要的)。
internal class MyClass {}
指定类是公共的,要使用关键字public
public class MyClass {}
以这种方式声明的类不能是私有的或受保护的。
指定类是抽象的(不能实例化,只能继承,可以有抽象成员),可以是公共抽象类,也可以是内部抽象类
abstract class MyClass {}
指定类是密封的(sealed,不能继承),可以是公共密封类,也可以是内部密封类
sealed class MyClass {}
注意:在c#的类定义中,只能有一个基类,如果继承了一个抽象类,就必须实现继承的所有抽象成员(除非派生类也是抽象的)
编译器不允许派生类的可访问性高于基类。即内部类可以继承与一个公共基类,但是公共类不能继承与一个内部类。
public class MyBase {}
internal class MyClass :MyBase {}
如果没有使用基类,则被定义的类就只能继承于System.Object
除了以这种方式指定基类外,还可以在冒号之后指定支持的接口。如果指定了基类,它必须紧跟在冒号的后面,之后才是指定的接口。
如果没有指定基类,则接口就跟在冒号的后面。必须使用逗号分隔基类名(如果有基类)和接口名。
public class MyClass : MyBase , IMyInterface
public class MyClass : IMyInterface
可以指定多个接口
public class MyClass :MyBase, IMyInterface, IMySecondInterface
接口的定义:
声明接口的方式与声明类的方式相似,但是使用关键字是interface,而不是class
interface IMyInterface {}
访问修饰符关键字public和internal的使用方式相同的,与类一样,接口也默认定义为内部接口。所以要使用接口可以公开访问,必须使用关键字public关键字。
public interface IMyInterface {}
不能在接口中使用关键字abstract和sealed,因为这两个修饰符在接口定义中是没有意义的(它们不包含实现代码,所以不能直接实例化,且必须是可以继承的)。
接口的继承也可以用于类继承类似的方式指定。主要的区别是使用多个基接口。
public Interface IMyInterface : IMyBaseInterface, IMyBaseInterface2
接口不是类,所以没有继承System.Object
System.Object
所有的类都继承与System.Object
GetType()
以System.Type的对象的形式返回对象的类型
typeof()
可以把类名转化为System.Type对象。
构造函数和析构函数
在C#中定义类时,常常不需要定义相关的构造函数和析构函数,因为在建立代码时,如果没有提供它们,编译器会自动添加它们。
在.NET中使用的析构函数(由System.Object类提供)叫做Finalize(),但这不是我们用于声明析构函数的名称。
构造函数初始化器:它把代码放在方法定义的冒号后面。可以在派生类的构造函数定义中指定所使用的基类构造函数。
public MyClass(int i, int j):base(i)
除了base关键字外,这里还可以将另一个关键字this用作构造函数初始化器。
类库项目:
如果一个项目什么都不包含,只包含类(以及其他相关的类型定义,但没有入口点),该项目就称为类库。
类库项目编译为.dll程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容。这将扩展对象提供的封装性。
接口和抽象类
类似之处:
1.都包含可以由派生类继承的成员
2.都不能直接实例化
区别:
1.派生类只能继承一个基类,即只能直接继承一个抽象类(但可以用一个继承链包含多个抽象类)
类可以使用任意多个接口。只是采用接口的方式略有不同
2.抽象类可以拥有抽象成员(没有代码体)和非抽象成员(拥有代码体)
接口成员必须都在使用接口的类上实现(没有代码体)
3.接口成员是公共的
抽象类的成员可以是私有的、受保护的、内部的、或受保护的内部成员
4.接口不能包含字段、构造函数、析构函数、静态成员或常量
5.抽象类主要用作对象系列的基类,共享某些主要特性
接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。
结构类型:
结构是值类型,而类是引用类型。
浅度和深度复制:
浅度复制:通过MemberwiseClose()方法实现,没有考虑引用类型成员,新对象中的引用成员就会指向与源对象中相同成员的对象
深度复制:实现ICloneable接口,创建成员的新实例(复制值,而不是复制引用)