C#基础 基本语法3

补充:九章
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()
{
}
}

posted on 2014-04-07 17:02  钟灵毓秀的家园  阅读(143)  评论(0编辑  收藏  举报

导航