C#笔记
- 静态方法不对特定实例进行操作,不与实例相关联,它属于类。因为静态方法与类相关联,所以调用静态方法不需要创建类实例,只需要类名和方法名,中间加上点号。静态方法只能访问静态变量,不能访问非静态变量。
- 非静态方法既可以访问类中的静态成员,也可以访问非静态成员。非静态方法属于对象,需要通过实例化的对象进行访问。
- 在类的方法中局部变量可能与类的变量重名,C#引入this解决这一问题。this相当于类的对象,表示对调用该方法的对象的引用。而静态变量从根本上来说是属于类的,因此不能使用this访问静态变量。
- 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。外部变量的说明符为extern。
- ref 参数类型 参数名 引用类型可以改变参数的值,但是值类型不可以。
当返回值超过一个的时候,可以使用输出参数。声明格式:
(out 参数类型 参数名 )
在函数的实参中,输出类型的那个参数前要加上out关键字,使用out参数时必须看成未赋值的,即使已经传值给它。在return 语句返回值之前,必须给out参数赋值。
使用foreach语句对数组进行遍历,只能采用只读的方式,不能修改任何元素的值。
-
- 数组类型 [,] 数组名
- 数组类型[,] 数组名 =new 数组类型[行,列]
- 数组本身就是一种引用类型
- 函数定义时参数列表加关键字params,方法被调用时可以传递一个值给参数,也可以传递给一个参数或者任意个参数值,也就是参数的个数是任意的,这样就保证了方法的灵活性。
继承
- C#继承中字段、属性、方法、事件、索引指示器可以继承,值类型、构造函数、析构函数不可以继承。
- C#是单继承,可传递(A派生出B,B派生出C,则C既继承B中的成员又继承A中的成员),可填不可删(派生类可以添加新的成员,但是不可以删除从基类继承的成员)
- base 关键字在派生类中直接访问基类成员 base.基类变量;base.基类方法();
- base关键字可以指定创建派生类时应调用的基类构造函数,并且调用基类的构造函数完成对基类成员的初始化。
函数(,):base(,){} - 继承中的构造函数:
-
- 调用顺序:基类的构造函数——>派生类的构造函数
- 执行数序:基类——>派生类
- 执行基类的构造函数:无参——>有参
- 非虚方法重载,函数名必须相同,参数列别必须不同
- 方法重写即在派生类中重新定义虚方法,需要使用override修饰符,函数名、参数列表必须与基类相同。
抽象
抽象类的使用
- abstract class 类名{}
- 抽象类只能作为其他类的基类,不能直接实例化
- 抽象类可以包含抽象方法,从抽象类派生来的非抽象类必须包含继承的所有抽象方法的实现。
抽象函数的使用
- 访问修饰符 abstract 返回值 方法名();
- 抽象方法没有实现,方法定义的后面只是分号;
- 抽象方法只能在抽象类中声明,不能把抽象方法声明为static
- 抽象方法在派生类中不能使用base关键字来进行访问。
- 可以使用抽象方法重载基类的虚函数。类A声明了自己的虚函数F,派生类B用抽象方法重载了这个虚方法,这样B的派生类C就可以重载F并提供自己的实现。
密封
- 避免无限制的继承
密封类
- 访问修饰符 sealed class 类名{}
- 密封类不能被继承
- 密封类不能使用abstract关键字
密封方法
- 密封方法不可以被重写,但是密封方法必须对基类的虚方法进行重写,因此sealed 与override一起使用。类B对类A的虚函数进行重写,同时对F()方法使用了sealed修饰符,成为一个密封方法,在B的派生类C中,不能重写F()方法。