1. 填空题
(1)面向对象的语言具有 封装 性、 继承 性、 多态 性。
(2)能用foreach遍历饭访问的对象需要实现 IEnumerable 接口或声明 GetEnumerator 方法的类型。
(3)c#中的三元运算符是 ? : 。
(4)当整数a赋值给一个object对象时,整数a将会被 装箱 。
(5)类成员有 3 种可访问形式。(this.;new Class().Method;)(public private protected)
(6)在.NET中所有可序列化的类都被标记为 [serializable] 。
(7)在.NET托管代码中我们不用担心内存漏洞,这是因为有了 GC处理机制。
(8)用sealed修饰的类有什么特点 不可被继承 。
(9)利用operator声明且仅声明了= =,有什么错误吗?
要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="。
(10)列举ADO.NET中的五个主要对象connation、command、datareader、dataadapter、dataset。
2. 不定项选择题
- 以下叙述正确的是(BC)
A.接口中可以有虚方法。 B.一个类可以实现多个接口。
C.接口不能被实例化。 D.接口中可以包含已实现的方法。 - 从数据库读取记录,你可能用到的方法有( BCD)
A.ExecuteNonQuery B.ExecuteScalar C.Fill D.ExecuteReader - 在对SQL Server 数据库操作时应选用( A )
A.SQL Server .NET Framework 数据提供程序。
B.OLE DB .NET Framework 数据提供程序。
C.ODBC .NET Framework 数据提供程序。
D.Oracle .NET Framework 数据提供程序。 - 下列选项中,(C)是引用类型。
A.enum类型 B.struct类型 C.string类型 D.int类型 - c#的数据类型有(B)
A.值类型和调用类型 B.值类型和引用类型
C.引用类型和关系类型 D.关系类型和调用类型 - 下列描述错误的是(D)
A.类不可以多重继承而接口可以 B.抽象类自身可以定义成员而接口不可以
C.抽象类和接口都不能被实例化 D.一个类可以有多个基类和多个基接口 - 在DOM中,装载一个XML文档的方法(B)
A.save方法 B.load方法 C.loadXML方法 D.send方法 - 下列关于构造函数的描述正确的是(C)
A.构造函数可以声明返回类型 B.构造函数不可以用private修饰
C.构造函数必须与类名相同 D.构造函数不能带参数 - 以下是一些c#中的枚举型的定义,其中错误的用法是(ACD)
A.public enum var1{Mike=100,Nike=102,Jike}
B.public enum var1{Mike=100,Nike,Jike}
C.public enum var1{Mike=-1,Nike,Jike}
D.public enum var1{Mike,Nike,Jike} - int[][] my Array3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][2]的值是(D)
A.9 B.2 C.6 D.越界
3.简述题
- 请简述private、protected、public、internal修饰符的访问权限。
答:(详述)①public(公开):给类,及所有类成员使用;范围:当前类自身/所有的子类/同一程序集其他类通过实例化也可以访问/其他程序集中的类也可以实例化访问.
②private(私有):给类,及所有类成员使用;范围:当前类自身/所有类成员的默认访问修饰符.
③protected(受保护的):类,内嵌类的所有成员;范围:当前类自身/所有的子类可以访问/同一程序集其他类不可以访问/其他程序集中可以通过继承也可以访问.
④internal:类,内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化访问/同一程序集中的子类也可以访问/其他程序集中不管是不是子类都无法访问.
⑤internal protected:类,及内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化进行访问/所有子类可以访问/其他程序集中可以通过继承进行访问,但实例化不行.
(简述)①public:公开的,运用于类以及类成员,范围:所有代码都可以访问。
②private:私有的,运用于类以及类成员,范围:当前类自身,只能在本类中访问,所有类成员默认访问修饰符。
③protected:受保护的,类、内嵌类的所有成员,范围:当前类以及所有的子类。
④internal:类、内嵌类的所有成员,范围:同一程序集。
⑤protected internal/internal protected:类、内嵌类的所有成员,范围:同一程序集和子类。 - 请叙述const与readonly的区别。
答:①Const表示常量,定义的时候就要初始化,静态
②readonly只读,定义的时候可以不用初始化,可以延迟到构造方法中进行初始化。 - 请叙述类与结构的区别。
答:①值类型与引用类型:
- 结构(Struct)是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应system.string 结构 ,通过使用结构可以创建更多的值类型。
- 类(Class)是引用类型:引用类型在堆上分配地址;堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
i. 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用;
ii. 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object;
iii. 虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
②继承性: - 结构(struct):不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
- 类(class):完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
③内部结构: - 结构(struct):
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化
在结构中初始化实例字段是错误的 - 类(class):
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化
4.数据库题
- .NET中读写数据库需要用到哪些类?他们的作用?
答:①connection:建立与数据库的链接。
②command:用来对数据库发出一些指令或存储过程。
③datareader:读取数据。
④dataadapter:是dataset和数据源之间的桥梁。
⑤dataset:把从数据库中所查询到的数据保留起来,存储的是一张表或多张表。 - 说出你所了解的数据库访问组件(例如ADO,至少4种)
答:①微软:MDAC 早期微软产品用的
②Java:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用 Java语言编写的类和接口组成。
③PDO:PHP上面用的数据库访问层
④ADO: ADO (ActiveX Data Objects, ActiveX数据对象 )是Microsoft提出的应用程序接口( API )用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从 DB2 或 Oracle 数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。 - 写出一条Sql语句:取出表A中第31到第40记录(sql server ,以自动增长的ID作为主键 ,注意:ID可能不是连续的。)
答:解1: select top (10) * from A where id not in (select top 30 id from A)
解2: select top (10) * from A where id > (select max(id) from (select top 30 id from A )as A) - 如何处理百万条数据的优化?
答:①如果有唯一字段的,创建主键和索引,提高查询主键字段效率;
②如果这些数据是变更的,可以通过时间来创建分区;
③如果部分老数据都是不需要的数据(不常用),可以定期将老数据备份到其他位置;
④如果是查询的话,可以通过分页查询的形式进行,不要一次性读取过多数据。
详解:https://www.cnblogs.com/aini80216051-/p/7155586.html
5. 结果输出题
- 写出下面程序输出的结果
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "string being converted.";
}
static void Add(int i) {
i++;
}
static void AddWithRef(ref int i) {
i++;
}
static void Main() {
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
输出结果:10;21;0;Str;string being converted.
- 写出下面程序的输出结果
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
输出结果:
A B
A.Fun()
6.编程题
- 一列数的规则如下:1、1、2、3、5、8、13、21、34…求第30位数是多少,用递归和非递归算法实现(C#语言)
答:①递归算法
public class MainClass{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0) {
return 0;
}
else if(i > 0 && i <= 2) {
return 1;
}
else{
return Foo(i -1) + Foo(i - 2);
}
}
}
②非递归算法
public static void Do2()
{
Console.WriteLine(Foo2(30).ToString());
}
public static int Foo2(int positionIndex)
{
if (positionIndex <= 0)
{
return 0;
}
else if (positionIndex <= 2)
{
return 1;
}
int index1 = 1;
int index2 = 1;
int index = 0;
for (int i = 2; i < positionIndex; i++)
{
index = index1 + index2;
index1 = index2;
index2 = index;
}
return index;
}
7.分析题
以下代码段中能否编译通过?请给出理由
try
{
}
catch(FileNotFoundException e1)
{
}
catch(Exception e2)
{
}
catch(IOException e3)
{
}
catch
{
}
结论:不能通过,因为所有的异常都继承Exception,当定义了一个Exception方法后,紧跟其后的IOException就会编译错误,但是catch没有继承Exception方法,不会报错。