1.面向对象的三大特点
封装、继承、多态
1.封装
封装是将数据和行为相结合,通过行为约束代码修改数据的程度,增强数据的安全性,属性是C#封装的最好表现。
(将实现细节,通过接口形式暴漏给第三方,而第三方者不需要关心实现细节。)
(virtual) 代表虚函数,意味着子类可以覆盖其实现,如果子类不覆盖那将是用父类的同名函数。
2.继承
提高代码重用度,增强软件可维护性的重要手段,符合开闭原则。
(就是将共用的属性或方法抽离到父类的过程。)
(protected)只能子类调用,外界类不能访问。
3.多态
多态是指同名的方法在不同环境下,自适应的反应出不同得表现,是方法动态展示的重要手段。
(通过继承实现不同方法的方法,表现出不同的行为,称之为多态。)
2.值类型和引用类型的区别
区别:
1.值类型存储在内存栈中,引用类型谁存储在内存堆中,而内存单元中存放的是堆中存放的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType,引用类型继承自System.Object。
4.private,public,protected,internal的区别
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
5. C#中所有引用类型的基类是什么
引用类型的基类是 System.Object ,值类型的基类是 System.ValueType
同时,值类型也隐式继承自 System.Object
6. ArrayList 和 List<T>的主要区别
ArrayList:不带泛型 数据类型丢失
List<T>:带泛型 数据类型不丢失
ArrayList:需要装箱拆箱 List<T>不需要
7.装箱和拆箱
装箱是将值类型转换成引用类型。
拆箱是将引用类型转换成值类型,只有装箱过的对象才能拆箱。举个例子一个方法需要传参
函数(Object)
传入的参数如果是值类型就是装箱(把int(值类型)转成Object的过程)
再定义一个值类型接收就是拆箱(定义一个(int a=(int)Obj))
(调用含有object类型的方法的时候,传入值类型的时候就会发生装箱,方法之中处理该参数的时候会发生拆箱。
定义泛型的时候,如果为了通用定义object类型,当添加值类型的时候就会发生装箱和拆箱。)
8.抽象类
一个包含一个或多个纯虚函数的类叫抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例。一个抽象类只能通过接口和作为其它类的基类使用,抽象类不能直接被实例化。
关键字:abstract
1、一个抽象类可以同时包含抽象方法和非抽象方法。
2、抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型,不涉及主体代码,
3、派生自抽象类的类需要实现其基类的抽象方法,才能实例化对象。
4、使用override关键子可在派生类中实现抽象方法,经override声明重写的方法称为重写基类方法,其签名必须与override方法的签名相同。
9.接口
接口是指定一组函数成员,而不实现他们的引用类型。可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。
关键字:interface
1、接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员。
2、接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。
3、接口成员是自动公开的,且不能包含任何访问修饰符。
4、接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。
5、当一个类既继承基类,又继承接口的时候,必须基类写在前面,基类和接口用逗号隔开,一个类只能有一个基类,可以继承许多接口
10.Interface与抽象类之前的不同
1.接口不是类,不能实例化,抽象类可以间接实例化。
2.接口是完全抽象 抽象类为部分抽象。
3.接口可以多继承,抽象类是单继承。
11.ref和out
参考:https://www.cnblogs.com/gsk99/archive/2010/12/13/1904557.html
传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。