第一周
1、 变量命名的规则有哪些?
答: 1.可以由字母、 数字、下划线、@符号组成,并且不能以数字开头
2.同一作用域下不能重名
3.不能使用系统的关键字
4.见名知意
5.采用驼峰命名法
2、写出13种基本数据类型和所占字节以及变量定义的格式?
答: 1、1个字节:bool、byte、sbyte
2个字节:char、short、ushort
4个字节:int、uint、float
8个字节:long、ulong、double
16个字节:decimal
格式:数据类型 变量名 = 初始值;
3、写出if分支语句的三种格式,并描述执行顺序?
答:1、if(条件表达式){
语句;
}
如果条件表达式成立,执行语句;
2、if(条件表达式1){
语句1;
}else{
语句2;
}
如果条件表达式1成立,执行语句1,否则执行语句2;
4、写出for循环和while循环的语句格式,并描述执行顺序?
答:1、for(循环变量初始化;循环条件;循环变量改变){
循环体;
}先执行循环变量初始化,判断循环条件,若条件成立,执行循环体,然后循环变量改变,再判断条件,如果成立,再执行循环体…
2.while(条件表达式){
循环体;
}先判断条件表达式是否成立,如果成立,执行循环体,否则调出循环
5、描述什么是逻辑或短路和逻辑与短路?
答:1、逻辑或:当逻辑运算符左侧的表达式为真时,不再执行右侧的表达式
2、逻辑与:当逻辑运算符左侧的表达式为假时,不再执行右侧的表达式
6、描述continue和break在循环中使用的作用是?
答:1、continue:结束本次循环,继续下次循环;
2、break:结束本层循环,循环结束;
第二周
1、 写出所有动态初始化一维数组的格式以及静态初始化的格式,以及数组所占用内存空间大小的计算方式?
答: 1、动态初始化:数据类型[] 数组名 = new 数据类型[数组长度];
2、动态初始化:数据类型[] 数组名=new 数据类型[数组长度]{元素1,元素2,...};
3、动态初始化:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
4、静态初始化:数据类型[] 数组名 = {元素1,元素2,...};
5、数组占用的内存空间大小:数组中数组的元素个数*每个元素所占空间大小
2、简述类中方法的作用是什么?写出定义方法的格式?
答:1、方法的作用:用来实现特定的功能,将一些复杂的逻辑进行拆分,模块化管理代码,提高代码的复用性。(2分)
2、方法定义格式:访问修饰符 返回值类型 方法名(参数列表)
{
语句;
}(3分,有一处错误不给分)
3、写出讲过的几种访问修饰符?
答:public、private、protected、internal、protected internal;
4、写出什么是类,什么是对象?
答:类:具备相同特征和行为的事物的抽象,就相当于一个自定义数据类型,可用于定义变量,是抽象的概念。
对象:类的实例,类的具体表现,生活中的万物都是对象,相当于变量,占用内存空间。
5、描述什么是结构体变量和结构体成员变量?
答:1、结构体变量:由结构体类型创建变量
2、结构体成员变量:定义结构体类型时,在大括号中声明的变量
第三周
1、值类型和引用类型有何区别?
答: 1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中;
2.值类型存取速度快,引用类型存取速度慢;
3. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用;
4. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放。
2、写出所有的值类型和引用类型?
答: 1、值类型:13中基本数据类型、结构体、枚举;
3、ref参数和out参数是什么?有什么区别?
答:1、ref为引用参数,后面参数的类型为值类型,当把形参值修改后,实参的值也相应的进行修改,使其具有引用类型的性质,但在传实参时,实参必须先赋值;
2、out参数为输出参数,是从方法内部向外部进行传,即把形参传递给实参,方法参数中可以有多个out修饰的参数,形参传递值给实参时要先赋值,而实参可以不用赋值,out参数解决了一个方法不能返回多个返回值的缺陷。
4、结构体和类有何区别?
答:1、语法上的区别:定义类是使用关键字Class,而定义结构体时使用关键字Struct
2、结构体中不可对声明字段进行初始化,但是类可以
3、如果没有为类定义构造函数,C#编译器会自动生成一个无参数的实例构造函数,即隐式构造函数,但是如果我们为类显式地定义了一个构造函数,C#编译器就不会再生成隐式构造函数了;而结构体中,不论你是否显式地定义了构造函数,隐式构造函数都是一直存在的
4、类是引用类型,而结构体是是值类型
5、结构体不能定义析构函数,而类可以有析构函数
6、不能用Abstract(抽象)和Sealed(密封)关键字修饰结构体,但是类可以
第四周
1、类中静态字段与非静态字段有什么区别?
答:加static修饰字段时,则该字段为静态字段,静态字段不属于某个实例对象,只与类型相关联,对静态字段的访问只与类型关联,访问时使用类型.字段,实例字段的访问与实例对象关联,访问时使用对象名.字段。
2、面向对象的思想的三个基本特征?分别描述一下定义?
答:封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
多态:同一种方法作用于不同对象可以产生不同的结果
3、简述抽象方法和虚方法的区别?
答:抽象方法:1、用abstract修饰
2、不允许有方法体
3、必须被子类override
4、只能在抽象类中
虚方法:1、用virtual修饰 2、要有方法体,哪怕一个分号 3、可以被子类override 4、除了密封类都可以写
4、类中构造方法的作用是?简述构造方法的特点?
答:作用:负责开辟内存空间,初始化对象
1.构造方法的方法名必须和类名一致
2.构造方法没有返回值,不需要写void
3.构造方法能够添加参数
4.构造方法允许重载
5.如果没有给类添加构造方法,系统会提供一个默认的构造,也就是只开辟空间
6.如果将某个构造方法设为私有的,就不允许再通过这个构造创建对象
1、什么是装箱和拆箱? (2分)
从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱
2、override与重载的区别 (3分)
重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要;
override 是进行基类中函数的重写。为了适应需要。
3、C#有几种表达式?根据什么确定表达式的类型?(2分)
在C#中,基本表达式有5种:算术表达式、关系表达式、逻辑表达式、条件表达式和赋值表达式.表达式的类型由运算符的类型决定
4、简述类和结构体的区别(3分)
类的声明和结构体的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构体和定义新的类的方法也非常类似。类和结构体的具体区别为:(1)结构体是值类型,类是引用类型。(2)结构体不能从另外一个结构体或者类继承,本身也不能被继承,而类是完全可扩展的,自身也能被继承。(3)结构体没有默认的构造函数,但是可以添加构造函数,没有析构函数;类有默认的构造函数,也有析构函数
5、抽象类和接口的区别(3分)
1. 一个类只能继承一个抽象类,但可以同时继承多个接口;
2. 抽象类里面可以有字段,接口里面不能有字段;
3. 抽象类里面可以有私有成员,接口里面所有的成员都是公有的;
4. 抽象类的成员可以带或者不带访问修饰符,接口里面一定不带访问修饰符;
5. 一个子类继承抽象类时需重写里面的抽象方法,当子类是抽象类时可以不用重写,而继承接口时一定要实现接口里面的成员;
6、简述抽象方法和虚方法的区别 (3分)
抽象方法:1、用abstract修饰 虚方法:1、用virtual修饰
2、不允许有方法体 2、要有方法体,哪怕一个分号
3、必须被子类override 3、可以被子类override
4、只能在抽象类中 4、除了密封类都可以写
1、封装
* 封装是面向对象的第一步
* 封装就是把数据、方法等集合在一个单元里,也就是类
* 封装的意义:保护代码、屏蔽复杂性
2、继承
* 使用场景:当多个类具有多个相同的字段和方法时,可以将公共的部分定义成父类,供其他类去继承,这样子类中就不用重复添加这些相同的字段和方法
* 继承的实现: 通过在派生类的后面填上冒号和基类名称,就可以指定基类
* 继承的优势:省代码,增强程序的可扩展性,可修改性,可复用性
* 继承的上层:基类 继承的下层:派生类
*注 意:
* 如果创建类的时候,没有指定基类,这时,该类默认是继承自Object类(根类)
* 继承具有遗传性,C继承B,B继承于A,这时C类对象就能够拥有B类和A类中的公开的特征和方法
* C#中的继承只支持单继承,也就是一个类只允许有一个父类
* C#中子类可以使用父类中所有的公开的字段、属性和方法
* 派生类对象可以赋值给基类对象,但是基类对象不能赋值给派生类对象
* 子类不能继承父类的构造方法
* 父类必须有一个无参的构造方法
* 子类的方法覆盖父类的方法(隐藏父类的方法),需要使用new关键字
* 被sealed修饰的类, 不允许被继承
3、虚方法覆盖
* 将基类的方法用关键字virtual修饰为虚方法,再由派生类用关键字override修饰与基类中虚方法有相同签名的方法,这就是对基类的虚方法重载
* 是多态的一种表现形式, 可以理解为 老子吹得牛逼让儿子来实现,儿子可以实现也可以不是实现
* 在父类中使用virtual修饰方法,在子类中要使用override
*注意:
1. 只有方法和属性才能是虚的,字段不能虚
2. 不能将虚方法声明为静态的
3. 不能将虚方法声明为私有的,因为私有方法不能被派生类覆盖
4. 覆盖方法必须和它相关的方法匹配,也就是说,他们的方法签名(方法名称/参数个数/参数类型/返回类型及访问修饰符等)都应该完全一致
5. 一个覆盖方法覆盖的必须是虚方法, 由于覆盖方法本身又是一个隐式的虚方法,所以它的派生类还可以覆盖这个方法,但不能将一个覆盖方法 显示第声明为虚方法