静态类和非静态类:
静态类(静态属性等)是类所有的,非静态类为类的实例所有的。
静态类是类的所有实例所共享的,无论此类创建了多少实例,静态类在内存中都只开辟了一块存储空间。
Const常量也可以看成这种类型:
public class myClass{
public const string KISS_MY_CLASS = "Oh, please kiss the class.";
}
调用时可以直接myClass.KISS_MY_CLASS
类的声明类型:
protected: 可以在派生的子类中访问的
internal:只有其所在类才可以访问(?)
abstract:不允许直接被实例化的类
sealed:不允许被继承的类
方法的声明类型:
virtual:抽象类里必须的虚拟方法,以此来表明此类为一个抽象类
sealed:不允许被继承的方法
override:多态的一种,覆盖,可以在直接使用父类的该方法base.xxx(e)的前提下,扩展自己的方法.
abstract:简单的定义一个类型,需要派生类具体来实现的抽象方法
extern:简单的定义一个类型
方法的参数类型:
值参:以此方法传递参数的,会copy一份相同值传入方法内部
引用参:ref int param1 直接将传递参数的实际值的地址传入方法,而不会开辟新的存储空间。param1需要被初始化
输出参:out int param2 与ref不同的是,param2不需要被初始化,其它与ref相同
数组参:params int param3[] 数组参必须位于参数列表的最后,内存中为参数的最未开辟了一个可变化的数组存储空间,此类参数不允许再带有ref,out
重载:方法名相同,返回类型相同,而参数不同(个数或类型)的多个方法
操作符重载:
操作符重载的需求起于对不同类型的相加的功能扩展,给操作符定义以新的含义,在特定的类上做新的栓释,比如传入字符串,则进行字符串的相加,这和常规的仅限于整型的+是不同的,当然此类需求也可以扩展到业务类的相加。
可被重载的操作符为:
+ - * % / ++ --
true false
<< >> == != > < >= <=
! & | ^ ~
重载的方法(比如洛奇升一级的加点,Player为洛奇的玩家对象,我们用重载++来实现升级的新含义)
public static Player operator ++ (Player _p){
_p.strength += ;
_p.AP += 3;
_p.ability += 1;
return _p;
}
再比如笛卡尔加法:
public static DKR operator + (DKR d1, DKR d2){
DKR _dkr = new DKR();
_dkr.x = d1.x + d2.x;
_dkr.y = d1.y + d2.y;
_dkr.z = d1.z + d2.z;
return _dkr;
}
实现了这种类的相加:) 很好用吧。可以大大扩展我们的常规思维方法。
readonly:只读域只能够在构造函数中进行修改
public static readonly string KISS_MY_CLASS = "Oh, please kiss the class.";
public const string KISS_MY_CLASS = "Oh, please kiss the class.";
以上两句可以起到相同的效果
不同的是,const的表达式的值是在编译时生成,而static readonly是在程序运行了之后才会被加载在内存中的。
所以在另一个项目引用此dll时,如果KISS_MY_CLASS修改后,必须重新编译此dll,才能得到新的常量,而如果为static readonly,则不用编译即可以得到修改过的常量值。
事件:Event
我们需要在Button的重载中定义一个事件的类OnDoubleClick()
1. 首先需要声明一个EventHandler的委托类(和abstract类似,只需要声明,不需要实现)
public delegate void EventHandler(object sender,EventArgs e);//定义一个委托的类型,Event为EventHandler
public class Button: Control{
public event EventHandler DoubleClick; //定义一个事件OnDoubleClick
protected void OnDoubleClick(EventArgs e){ //用来触发DoubleClick事件
if (DoubleClick != null){
DoubleClick(this.e);
}
}
}
索引器:
string _name = string[8];
public string this[int index]{
get{
return _name[index];
}
set{
_name[index] = value;
}
}
继承:C#中的继承规则.
1. 继承可传递
2. 派生类应当是对基类的扩展
3. 构造函数与析构函数不能被继承
4. 派生类如果定义了基类的同名成员,则基类的这些成员不能再被访问
5. 派生类可以重载基类的虚方法,虚属性和虚索引器,表现为多态
多态性:polymorphism
同一操作对应不同的对象,有不同的解释产生不同的结果。多态性可以通过重载基类中的虚函数型方法来实现。
重载虚方法,须使用override声明类型,而不能有static,virtual,new的修饰符
抽象类:
抽象类为它的派生类提供了一个公共的"界面",
抽象类的派生类若要实现它父类的方法,则必须使用override来进行覆盖重载,抽象类与接口不同的是它还可以使用非抽象方法,即派生类override它的时候能使用base.xxx();来加入原型的成员,但如果是抽象方法则不能使用base来进行访问。
抽象方法为抽象类中可以被其派生类重载的“界面”
如果在派生类中使用 public abstract override void func();
虚方法和抽象方法的区别:
抽象方法是没有实际方法的界面函数,即只给子类提供了方法定义,需要子类进行实现,而虚方法可以有自己的实现;
实现虚方法时,直接public override void func(),且里面可以用base.xxx()来加载原虚方法的内容,抽象类则不能。
抽象类一定要有一个虚方法,而不需要有抽象方法.