S2 深入.NET和C#编程 笔试测试错题积累
---恢复内容开始---
《深入.NET平台和C#编程》内部测试题-笔试试卷错题积累
1:
1) 以下关于序列化和反序列化的描述错误的是( C)。
a) 序列化是将对象的状态存储到特定存储介质中的过程
b) 二进制格式化器的Serialize()和Deserialize()方法可以分别用来实现序列化和反序列化过程
解析:BinaryFormatter
c) 如果一个类可序列化,则它的子类和包含的各成员对象也一定可序列化
问题出在了子类,如果子类压根不能进行序列化操作,则会抛出异常
d) 标识一个类可以序列化要使用[Serializable]
2:
下列关于虚方法(virtual)和抽象方法(abstract)的描述中错误的是( C)。
a) 虚方法必须有方法体,可以被子类重写
b) 抽象方法不允许有方法体,且必须被子类重写
c) 抽象方法必须在抽象类中,而虚方法可以在所有类中
密封类和静态类中不能书写
d) 在子类中重写抽象方法或虚方法,都需要用override关键字
注意:
1:如果一个类用Abstract修饰,那么该类就是抽象类;
2:抽象方法中可以有方法体,也可以有普通方法
3:抽象方法不能有方法体,甚至连{}都不能有,直接以分号结尾;
4:抽象类可以有构造
5:抽象类不能实例化
6:抽象类不能是密封类或者静态类的
为什么不能是静态类的:
静态类会静态存储区构建一个类的实例,而抽象类不能实例化,所以两者是相违背的
为什么不能是密封类的:
抽象类是让别人去继承 ,然后重写抽象方法
密封类不想让别人去继承,两者是相违背的
7:如果一个类继承自抽象类,必须重写抽象类的所有方法,除非子类本身也是抽象类
8:一键重写的快捷键是:Ctrl+.,或者是alt +shif +F10
9:抽象类中的抽象方法用来约束子类方法的格式的
10:抽象方法必须存在于抽象类中
4:
分析以下使用抽象类的C#代码,其最终的运行结果是(D )。
public abstract class Class1
{
public void F()
{
Console.Write("1");
}
abstract public void ABS();
}
public class Class2 : Class1
{
public override void ABS()
{
Console.Write("3");
}
public Class2()
{
Console.Write("2");
}
static void Main()
{
Class2 objB = new Class2();
objB.ABS();
}
}
//先调用构造,然后调用自身的ABS方法()
a) 12
b) 21
c) 13
d) 23
5:
下列代码的运行结果是( A)。
class Test
{
Public void F()
{
Console.Write("A");
}
}
class B : Test
{
Public new void F()
{
Console.Write("B");
}
Public void Say()
{
}
static void Main()
{
Test objA = new B();
objA.F();
}
}
注意:这里不是多态,所以用父类变量保存子类对象,取的是父类的方法。哪怕父类方法使用Virtual关键字,子类没有Override就不会实现多态。
以后我们碰到通过父类变量保存在对象的题目时,应该具备以下理解能力:
01.当new一个子类的时候,可以看成在子类对象中已经完全包含一个父类对象,所以我们可以在子类中通过this点出来父类的非私有成员。
02.父类变量只能调用到父类的方法,而不能调用子类的方法,即使该父类变量存储是子类。
程序员;编码能力 打字能力。
打字员:打字能力
a) A
b) B
c) BA
d) AB
6:
在开发C#程序过程中,会大量地使用类和对象,其使用方法不包括( BC)。
a) 将类实例化为对象
b) 将对象实例化为类
c) 通过类访问非静态属性或方法
d) 通过对象访问非静态属性或方法
7:
下面关于泛型集合Dictionary<String, Person> dict = new Dictionary<String,Person>()的操作代码正确的是(C )。
a) dict.Remove(dict[0]) //dict[0]不对,dict只能通过key访问,不可通过下标访问。
b) dict.RemoveAt(0) //没有RemoveAt方法
c) foreach(Person per in dict.Values){}
d) foreach(Person per in dict.Keys){}
8:
在C#中,( C)关键字用于子类的构造函数明确指明调用的父类的构造函数。
a) new 创建对象时使用
b) this 代表当前类的实例
c) base 显示调用父类的构造方法和父类属性和常规方法
d) is
9:
有如下C# 代码,则下面选项中说法正确的是(BC)。
public class A { } Person
public class B : A { } Student
A a = new A();
B b = new B();
a) 表达式a is B的值为true
b) 表达式b is A的值为true
c) 表达式a as B的值为null
d) 表达式b as A的值为null
10:
在C#中,下面是方法的重载的是(C)。
a) public string Test(int x, int y){ …}和public string Test(int a, int b){ …}同一个方法
b) public string Test1(int x, int y){ …}和public string Test2(int x, int y){ …}
c) public string Test(int x, int y){ …}和public string Test(int a){ …}
d) public string Test(int x, int y){ …}和public int Test(int x, int y){ …}同一个方法
方法重载的特点:
1:方法名相同
2:方法参数的类型不同或者是参数的个数不同
3:在同一个类中
4:和返回值没有关系
11:
关于如下C#的代码,说法正确的是(C);
public class A
{
string S1;
protected string S2;
protected void M1()
{
}
}
public class B : A
{
protected string S3;
}
a) 在A中可以访问S3 解析(父类中不可以访问子类受保护成员)
b) 在B中可以访问S1 解析( 如果类中变量没哟访问修饰符修饰,默认访问修饰符是private)
c) 在B中可以访问S2 解析(可以:因为其访问修饰符是protected类型)
d) 在M1( ) 中可以访问S3 解析(不可以在父类方法中访问子类字段)
12:
在C#中,下面关于结构的说法中,正确的是(C)。
a) 结构和类都是引用类型
b) 定义结构的变量必须用new
c) 不能在定义结构时给结构的成员设置初始值
d) 结构中的整型成员被自动初始化为1 自动初始化为0
13:
下面不是C#中类的访问修饰符的是(AD)。
a) protected
b) internal
c) public
d) internal protected
14:
假设要使用C#设计一个日志系统,要求程序运行时,
检查 system.log 文件是否存在,如果已经存在则直接打开,
如果不存在则创建一个,为了实现这个目的,应该以FileMode的(C)方式创建文件流。
a) CreateNew
b) Open
c) OpenOrCreate
d) Create
15:
19) 分析如下C#程序,运行输出的结果是( B)。
public struct Size
{
public int x;
public int y;
public Size(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Test
{
static void Main()
{
Size size1 = new Size(8,10);
Size size2 = size1;
size1.y = 200;
Console.WriteLine("{0} | {1}",size1.y,size2.y);
}
}
注意是结构体
a) 200 | 200
b) 200 | 10
c) 10 | 10
d) 10 | 200
16:
在C#语言中,以下关于集合的说法错误的是(A,C)。
a) ArrayList只能通过索引来访问和删除值 也可以直接删除某个对象
b) Hashtable可以直接通过键名来获取值 table[key]
c) 使用List<T>添加、读取元素时不需要拆箱和装箱,这一点和ArrayList相同
d) 使用Dictionary<K,V>可以通过Key获取Value,这一点和Hashtable相同
注意:
区分:
list<T> ArrayList
不同点:对于所保存的元素进行类型约束 可以增加任何的类型
添加/读取值类型元素无须拆箱和装箱 添加/读取值类型元素要拆箱和装箱
相同点:通过索引访问集合中的元素
添加的元素方法相同
删除的方法相同
Dictionary<K,V> Hashtable
不同点: 对于所保存的元素进行类型约束 可以增加任何的类型
添加/读取值类型元素无须拆箱和装箱 添加/读取值类型元素要拆箱和装箱
相同点:通过Key获取Value
添加的元素方法相同
删除的方法相同
遍历的方法相同