补充:九章
1、类用class定义、接口用interface定义。可以使用public和internal关键字定义类和接口的可访问性,类可以定义为abstract或sealed以控制继承性。
class
Myclass
{
//Class
members.
}
//默认情况下类的声明为内部的,只有当前项目的代码才能访问它。可以使用internal访问修饰符关键符显示指定它。如下(这个不必要的)
internal
class Myclass
{
//class
members.
}
2、除了public和internal中还可以使用abstract指定类是抽象的(不能实例化,只能继承,可以有抽象成员)或密封的(sealed,不能继承)
public
abstract class MyClass//不能实例化只能继承
{
//Class member,may be
abstract.
}
public sealed class MyClass//密封类可以是公共的或者内部的
{
//Class
members.
}
//C#的类定义中,只能由一个基类,如果继承了一个抽象类,就必须实现所继承的所有成员(除派生类也是抽象的)
//编译器不允许派生类的可访问性高于基类--------内部基类可以继承于一个公共积累,但公共基类不能继承于一个内部类
public
class MyBase
{
//Class members.
}
internal class
MyClass:Base
{
//Class members.
}
internal class MyBase//这个是错误的,不能编译
{
//Class members.
}
public
class MyClass:Base
{
//Class members.
}
3、如果没有定义基类,则被定义的类就只集成于基类System.Object它在C#中的别名是object(继承层次的结构中,所有类的根都是System.Object)
可以在冒号后面指定支持的接口,但是基类和接口同时指定时
public
class MyClass:MyBase,IMyInterface
{
//Class
members.
}
可以指定多个接口
public class
MyClass:MyBase,IMyInterface,IMySecondInterface
{
//Class
members.
}
//无或internal 只能在当前项目中访问类
abstract或internal abstract
类只能在当前项目中访问,不能实例化,只能提供继承使用
public abstract
类可以在任何地方访问,不能实例化,只能提供继承之用
sealed或internal sealed
类只能在当前项目中访问,不能派生之用,只能实例化
public sealed类可以在任何地方访问,不能提供派生之用,只能实例化。
声明接口 //修饰符关键字public 和internal使用方式是相同的。
interface IMyInterface
//public interface IMyInterface
{
//Interface
members.
}
不能在接口中使用关键字abstract和sealed
public interface
IMyInterface:IMyBaseInterface,IMyBaseInterface2
{
//Interface
members.
}
接口不是类,所以没有继承System,Object,但是为了方便System.Object可以通过接口类型的变量来访问-------------不能用实例化类的方式实例化接口。
4、Equals(object,object) 返回bool
ReferenceEquals(object,object) 返回bool 看看他们是否同一个实例的引用
GetType() 以System.Type对象的形式返回对象类型 返回
System.Type.
if(myObj.GetType()==type(MyComplexClass)){ }
GetHashCode() 用作对象的散列函数,这是一个必选函数,返回一个以压缩形式表示的对象状态的值
5、在C#中定义类时,常常不需要定义相关的构造函数和析构函数,编译器会自动添加他们。
Class MyClass
{
public MyClass()
{
//Default comstructor
code.
}
public MyClass(int myint)//看可以用相同的方式给类添加非默认的构造函数,其方法是提供参数
{
//Nodedefault constructor code(used myInt)
}//可提供的构造函数没有限制
}
6、构造函数执行序列
public class MyBaseClass
{
public MyBaseClass()
{
}
public MyBaseClass(int i)
{
}
}
public class MyDerivedClass:MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public
MyDerivedClass(int i,int j)
{
}
}
MyDerivedClass myObj=new MyDerivedClass();
类的访问序列,执行序列为
System.Object.Object();
MyBaseClass.MyBaseClass();
MyDerivedClass.MyDerivedClass();
//如果是MyDerivedClass myObj=new
MyDerivedClass(4);
System.Object.Object();
MyBaseClass.MyBaseClass();
MyDerrivedClass.MyDerivedClass(int
i);
想改变执行序列
public class MyDerivedClass:MyBaseClass
{
....
public
MyDerivedClass(int i,int j):base(i)
{
}
其中base关键字指定NET实例化过程中使用基类中所指定参数的构造函数。这里使用int参数(其值通过参数i传送给MyDerivedClass构造函数),所以应使用MyBaseClass(int
i) 这么做将不调用MyBaseclass()
而执行
System.Object.Object();
MyBaseClass.MyBaseClass(int
i);
MyDerivedClass.MyDerivedClass(int i,int j);
------------------------------------------------
除了base关键字,还可以将另一个关键字this用作构造函数初始化器。这个关键字指定在调用指定的构造函数前,NET实例化过程对当前类使用非默认构造函数
public
class MyDerivedClass:MyBaseClass
{
public MyDerivedClass():this(5,6)
{
}
........
public MyDerivedClass(int i,int j):base(i)
{
}
}
System.Object.Object();
MyBaseClass.MyBaseClass(int
i);
MyDerivedClass.MyDerivedClass(int i.int
j);
MyDerivedClass.MyDerivedClass();
唯一的限制是,使用构造函数初始化器只能指定一个构造函数。
定义构造函数时不能创建无线循环
public class MyBaseClass
{
public
MyBaseClass():this(5){ }
public MyBaseClass(int i):this()
{
}
}
原文:http://www.cnblogs.com/d685600/p/3650361.html