科大讯飞C#基础复习资料docx.docx
《科大讯飞C#基础复习资料docx.docx》由会员分享,可在线阅读,更多相关《科大讯飞C#基础复习资料docx.docx(17页珍藏版)》请在冰豆网上搜索。
科大讯飞C#基础复习资料docx
1、C#的编译原理
答:
源代码■…〉MSIL(微软屮间语言)机器语言:
以供计算机调用,载入内存时进行第二次编译。
编译时是按需编译,即只编译所用到的代码,而不是全部程序,称为JIT(即时编译)。
2、三犬结构
答:
顺序_
分支:
ifelse;switch...case;?
:
(三元运算符)循环:
whi1e;dowhi1e;for;foreach
3、短路运算
答:
所谓短路运算是指系统从左至右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况,则计算过程即被终止。
//短路运算用于逻辑运算:
II强
intx=6;
//由于x>5为true,整个表达式为true〃所以x<7被短路,不会运算
if(x>5||x<7)
//由于x>7
//所以x>2
为false>整个表达式为false被短路,不会运算
if(x>7Ux>2)
4、而向对彖的三大特性答:
封装、继承、多态
A、封装:
保证对象自身数据的完整性和安全性。
B、继承:
建立类之间的关系,实现代码复用,方便系统的扩展。
C、多态:
相同的方法调用可实现不同的实现方式。
5、类和结构体的区别
答:
相同点:
A、都可以包含字段,方法。
氏都可以实现接口。
不同点:
A、结构是值类型,类是引用类型。
B、结构(值)存放在栈(堆栈)中,类(引用)存放在堆中。
C、结构不能被继承,而类可以被继承。
D、结构不能包含显示的无参数的构造方法,类可以。
classProgram
{staticvoidMain(string[]args)
{
TestClasstc=newTestClassO;
tc.Num=5:
Console.WriteLine(tc.Num):
Doub1eMethod(tc);
Console.WriteLine(tc.Num):
Console.ReadKey();|
}
staticvoidDoubleMethod(TestClasstc){
tc.Num*=2;
}
}
classTestClass
{
publicintNum;
}
classProgram
{
staticvoidMain(string[]args)
{
TestStructts=newTestStruct():
ts.Num=5:
Console.WriteLine(ts.Num);DoubleMethod(ts):
Console.WriteLine(ts(.Num);
Console.ReadKey():
}
staticvoidDoub1eMethod(TestStructts){
ts.Num*=2;
}
}
structTestStruct
{
publicintNwn;
E、类使用吋必须用new关键字,而结构可以使用也可以不使用new关键字。
6、字段和属性的区别
答:
字段用于存储数据,属性是字段的封装,属性实际上是方法。
字段不可控制读写,而属性可以用set和get来实现可读可写的控制。
7、类的修饰符
答:
public、internalsstatic、abstractssealed
abstract:
用于声明虚类,指示某个类只能是其他类的基类。
partial:
部分在整个同一程序集中定义分部类、结构和方法。
sealed:
指定类不能被继承。
static:
声明静态类,类型本身只含有静态成员,不能被实例化。
8、类的访问修饰符
答:
public:
公共访问是允许的最高访问级别,对访问没冇限制;
private:
私冇访问是允许的最低访问级别,私冇类只冇在声明它们的类和结构体中才是可访问的;
internal:
类型和类型成员的访问修饰符。
只有在同一程序集的文件中,内部类型或成员才是可访问的;
protected:
受保护类在其所声明的类屮可由其所声明类的派生类实例访问
9、类成员访问修饰符以及含义
答:
A、public:
同一程序集屮的任何代码或引用该程序集的其他程序集都可以访问该类型或成员。
B、private:
成员的默认访问修饰符,只有同一个类或者结构中可以访问该类型或成员。
C^protected:
只有同一个类或者结构或者派生类中的代码可以访问该类型或成员。
D、internal:
同一程序集中的任何代码都可以访问该类型或成员,其他程序集中的代码不可以。
E、protectedinternal:
同一程序集屮的任何代码或其他程序集屮的任何派生类都可以访问该类型或成员。
10、什么是抽象类和抽象方法
答:
抽象方法:
使用ahstract修饰,并且没有方法实现的方法。
抽彖类:
用abstract修饰的类,不能被实例化,只能被继承,其屮的抽彖方法必须要被重写。
抽象方法必须在抽象类屮。
11、抽象类和接口的区别
答:
相同点:
A、都不能实例化。
B、都包含未实现的方法。
C、子类必须实现未实现的方法(抽象类是抽象方法,接口是所有成员)。
D、都可以继承一个或多个接口。
不同点:
A、抽彖类用abstract定义,接口用interface定义。
B、抽象类可以继承一个类,而接口不可以。
C、抽象类町以定义字段、属性和带有实现的方法,而接口不口J以。
D、接口的成员访问修饰符必须是public,而抽象类不是,可以随意定义。
12、什么是方法重载和垂写以及区别
答:
重载:
就是在同一个类屮存在多个同名的方法,而这些方法的参数列表(数量、顺序、类型)不同。
A、重载存在于同一个类中。
B、方法重载要求具有相同的方法名,不同的参数列表(数量、顺序、类型),与返回值类型没有关系。
重写:
就是在子类中重复定义父类方法,提供不同实现,存在于有继承关系的父子关系。
(当子类重写父类的虚函数后,父类对象就可以根据根据赋予它的不同了类指针动态的调用了类的方法。
)
A、只有以virtual和abstract标记的虚方法和抽彖方法才能被直接重写。
B、重写以关键字override标记,强调继承关系中对基类方法的重写。
C、重写方法要求具有相同的方法签名,包括:
相同的方法名、相同的参数列表和相同的返回值类型。
13、REF和OUT的用法
答:
A、ref关键字使参数按引用传递;out关键字使参数为输出参数°
B、使用ref型参数时,传入的参数必须先被初始化。
对out而言,必须在方法中对其完成初始化。
C、使用ref和ou(吋,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配。
D、out适合用在需要retrun多个返H值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
14、数组、集合和泛型集合的区别
答:
数组:
只能存放定义类型的元素,大小固定,取出时不用做类型转换。
集合:
可存放任意类型的元素,人小动态改变,取出时需要做类型转换。
泛型集合:
只能存放定义类型的元素,大小动态改变,取出时不用做类型转换。
15、自加和自减答:
加(减)在前而,就先加后用;加(减)在后而,就先用后加。
staticvoidMain(string[]args){
inta=1;
intd=0;
intb=a++;intc=++a;|
if((b==2)&&(c卄>1))
{
b--;
d=++c;
}
Console.WriteLine(a):
Console.WriteLine(b):
Console.WriteLine(c):
Console.WriteLine(d):
(3130)
16、什么是命名空间和程序集,以及它们的区别和联系
答:
命名空间:
声明自己的命名空间可以帮助控制类名称和方法名称的范围。
程序集:
构成了基于.NET的应用程序的部署、版本控制、重用、激活范围和安全权限的基木单元。
A、程序集用于纟R件的打包、部署、分发以及版木控制;命名空间前缀用于类型系统的逻辑划分。
B、命名空间是类库的逻辑组织形式,程序集就是类库的物理组织形式。
C、程序集简单理解为你的.NET项冃在编译后生成的*.exe或*.dl1文件。
D、一个程序集可以跨越n个命名空间,一个命名空间也可以包含n个程序集。
17>using的用法和new的用法
答:
using是引用已经创建好的实例。
A、引用命名空间
B、创建命名空间别名
C、强制资源清理,确保退出using语句时在对彖上调用Dispose=>
new是重新创建一个新实例。
A、运算符,用于创建对象和调用构造函数。
B、修饰符,用于隐藏基类成员的继承成员。
C、约束,用于泛型巾明中约束可能用作类型参数的参数的类型。
18、值类型和引用类型的区别,并举出儿个典型的事例
答:
值类型:
存储在栈中,传递的是值。
如:
基木数据类型(int,long,float,char,bool)、枚举(enum)、结构(struct)引用类型:
存储在堆中,传递的是引用。
如:
object、string、class>数组
值类型和引用类型的区别,就在于当函数参数传递的时候。
值类型是把自己的值复制一份传递给别的函数操作•无论复制的值怎么被改变•其口身的值是不会改变的。
而引用类型是把口己的内存地址传递给别的函数操作•操作的就是引用类型值的本身•所以值被函数改变了。
19、什么是装箱和拆箱操作
答:
装箱和拆箱是值类型和引用类型Z间相互转换是要执行的操作。
1.装箱在值类型向引用类型转换时发生,如inta=2;objectobj=a;
2.拆箱在引川类型向值类型转换时发生,如intb=(int)obj;personp=(person)Student;
20、所有类的父类
答:
子类使用new关键字屏蔽父类的方法,调用谁的方法由“定义时的类型决定”;
子类使用override关键字重写父类方法,调用谁的方法由“运行时引用真实的对象决定雹
classA{}
classB:
A{}
classTest
{
publicTest()
{
Aa=newB()asA;
21、最先执行的构造函数
答:
先执行父类构造函数,然后执行子类构造函数,最先执行的object的构造函数。
publicclassA
publicclassA
publicA()j
i
publicA()f
I
Console.WriteLine(*A,v):
i
i
Console.WriteLine('A*):
i
i
publicA(stringname):
this()
1
publicA(stringname):
this()j
i
Console.WriteLine(1AA");
i
I
Console.WriteLine("AA"):
i
i
publicvirtualvoidShowOj
j
publicvirtualvoidShowO
i
Console.WriteLine(*A.show*'):
i
Console.WriteLine('A.show"):
i
}
}
i
il
publicclassB:
A
publicclassB:
A!
publicB()
1
publicB():
baseCv){
{
Console.WriteLine('B');
i
Console.WriteLine('B*1):
}
}
publicoverridevoidShowO
j
publicnewvoidShowO
{
{
base.ShowO:
i
Console.WriteLine(,YB.show"):
Console.WriteLine(,YB.show**):
}
}
}
}
//Aa=newB();a.ShowO;
//Aa=newB();a.Show();
答案:
ABA.showB.show答案:
AAABA.show
22、什么情况下生成构造函数
答:
当定义了构造函数时,就不生成默认构造函数。
否则就会自动生成默认构造函数。
1.实例构造函数
使川new农达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。
2.私有构造函数
私冇构造函数是一种特姝的实例构造函数。
它通常用在只包含静态成员的类中。
如果类具冇一个或多个私冇构造函数而没冇公共构造函数,则其他类(除恢套类外)无法创建该类的实例。
3.静态构造函数
静态构造函数用來初始化静态变量,这个构造函数是属于类的,而不是属于哪个实例的。
就是说这个构造函数只会被执行一次。
也就是在创建第一个实例或引用任何静态成员Z询,由.NETH动调用。
23、子类可以赋值给父类对象(其中父类对象的类型可以为一般类、抽象类、接口),赋值后的对象可以再强制转换为原対象。
24.接口的隐式实现和显式实现以及他们的用法
答:
1隐式实现接口,接口和类(实现接口的类)都可以访问类中的方法;
2显式实现接口,C#没有提供任何语法,來在派生类屮调用基类屮显式实现的接口成员,只有通过接口来访问类中的方法;
3显式实现接口,可以帮助我们在对象级别隐藏高级成员。
但是,不要把显式实现当做安全眾垒。
只要把实例强制转换为接口,任何代码都可以调用此类的方法。
publicinterfaceIDao
{
voidInsert();
}
//接口隐式实现
publicclassSqlServerDao:
IDao
{
//I、访问修怖符为public
//2、SqlServerDaodao=newSqlServerDao();dao・Insert();
//$、IDaodao=newSqlServerDao();dao・Insert();
publicvoidInsert()
{
thrownewNotImp1ementedException():
//接口显式实现publicclassMySqlDao:
IDao{
//I、不需要写访问修怖符
//2s方法名前为实现的接口名
//3、IDaodao=newSqlServerDao():
dao・Insert();voidIDao・Insert()
{
thrownewNotImplementedException():
25、当构造函数为私有时,该类的用法
答:
私冇构造两数是一种特殊的实例构造函数。
它通常用在只包含静态成员的类屮。
如果类具有一个或多个私冇构造两数而没冇公共构造两数,则不允许其他类(除了嵌套类)创建该类的实例。
classProgram
{
staticvoidMain(string[]args)
{
MySqlDaodao=MySqlDao.GetInstance():
dao.Insert():
Console.ReadKey();
}
}
publicclassMySqlDao
{
//构造函数为私有privateMySqlDao()
{
}
publicvoidInsert()
{
Console.WriteLine("测试下•…“):
}
//I、静态方法的调用,不需要实例化,直接通过类名访问//2、静态方法和私有方法在同一类中,可直接访问publicstaticMySqlDaoGetInstance()
{
MySqlDaodao=newMySqlDao():
returndao:
26、静态变量和实例变量的区别
答:
静态变量属于类,不用实例化就已经存在,所有的实例共亨同一个静态变量,可以通过类名和实例名來访问。
实例变量属于实例,每个实例都有自己的这个变量,只能通过实例名來访问。
在语法定义上的区别:
静态变最前要加static关键字,而实例变最前则不加。
在程序运行时的区别:
1、实例变量属于某个对彖的属性,必须创建了实例对彖,其中的实例变量才会被分配空间,才能使用这个实例变量。
2、静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对彖,静态变量就会被分配空间,静态变量就町以被使用了。
总之,实例变量必须创建対象后才可以通过这个対象來使用,静态变量则可以直接使用类名来引用。
27、异常处理各个模块的作用
答:
try:
尝试执行catch:
捕获异常throw:
抛出界常
(1)Try:
是程序屮町能出现错谋的操作部分。
(2)Catch:
是用来处理各种错误的部分(可以冇多个)。
必须正确排列捕获异常的Catch了句,范I韦I小的Exception放衣前面的Catcho即如果Exception之间存在继承关系,就应把子类的Exception放在前血的Catch子句中。
(3)Finally块的代码用来清理资源或执行要在Try块末尾执行的其他操作(可以省略)。
无论是否产生异常,Finally块都会执行。
例:
trv
{
intx二123/0;//会抛出一个除数为0的异常
}
catch
{
//・・・〃在这里捕捉到这个异常,然后进行相关处理
}
finally
{
//・・・//在这里做最后的清理或是其他工作
}
28、字符串常用函数的用法
答:
Equals.Indexof、LastIndexof、Length、Replace.Split.StartsWith,Substring、Tolower、Toupper、Trim、TrimEnd、TrimStart
29、String和StringBuilder的区别
答:
StringX'J象是不可改变的。
每次使用System.String类屮的方法Z—时,都要在内存屮创建一个新的字符出对象,这就需要为该新对象分配新的空间。
在需要对字符串执行重复修改的悄况下,与创建新的String对象相关的系统开销可能会非常昂贵。
如果要修改字符出而不创建新的对象,则可以使用System.Text.StringBuilder类。
例如,当在一个循环屮将许多字符串连接在一起时,使用StringBuilder类可以提升性能。
StringBuilder表示可变字符串,提供棊木的替换和添加和删除字符串中的文木,字符串的长度比较长时有较高的效率。
String表示不可变字符串,在进行字符串连接的时候是新建一•个字符串,进行连接后,最后赋值,如果对String赋值多次,就会在内存中保存多个这个对彖的副本,浪费系统资源。
需要频繁的使用字符串拼接操作的时候一般用StringBuildero
30、三层架构
答:
三层架构(3・tierapplication)通常意义上的三层架构就是将整个业务应用划分为:
表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)o区分层次的目的即为了“高内聚,低耦合”的思想。
(1)概念简介:
1、表示层(UI):
通俗讲就是展现给用户的界面,即用户在使川一个系统的时候他的所见所得。
2、业务逻辑层(BLL):
针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):
该层所做事务直接操作数据库,针対数据的增添、删除、修改、更新、查找等。
⑵各层的作用:
1、数据数据访问层:
主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是対数据的操作,而不是数据库,具体为业务逻辑层或表示层捉供数据服务。
2、业务逻辑层:
主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。
3、表示层:
主要表示Web方式,也可以表示成WinFrom方式,Web方式也町以表现成:
aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
⑶具体的区分方法:
1、数据数据访问层:
主要看你的数据层里面有没存包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作,而不必管其他操作。
2、业务逻辑层:
主要负责对数据层的操作,也就是说把一些数据层的操作进行纽合。
3、表示层:
主要对用户的请求接受,以及数据的返冋,为客户端提供应用程序的访问。
⑷优缺点:
优点:
1>开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
缺点:
1、降低了系统的性能。
这是不言而喻的。
如果不采用分层式结构,很多业务可以肓接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有吋会导致级联的修改。
这种修改尤其体现在口上而下的方向。
如果在表示层小需耍增加一个功能,为保证-其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
表示层
业务逻辑层
数据访问层数据库
3、增加了开发成本。