C#简单题知识

第一周

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. 一个覆盖方法覆盖的必须是虚方法, 由于覆盖方法本身又是一个隐式的虚方法,所以它的派生类还可以覆盖这个方法,但不能将一个覆盖方法 显示第声明为虚方法

你可能感兴趣的:(C#简单题知识)