《深入.NET平臺和C#編程》內部測試題-筆試試卷 一 選擇題 1) 以下關於序列化和反序列化的描述錯誤的是( C)。 a) 序列化是將對象的狀態存儲到特定存儲介質中的過程 b) 二進位格式化器的Serialize()和Deserialize()方法可以分別用來實現序列化和反序列 化過程 解析:Bi ...
《深入.NET平臺和C#編程》內部測試題-筆試試卷
一 選擇題
1) 以下關於序列化和反序列化的描述錯誤的是( C)。
a) 序列化是將對象的狀態存儲到特定存儲介質中的過程
b) 二進位格式化器的Serialize()和Deserialize()方法可以分別用來實現序列化和反序列
化過程
解析:BinaryFormatter
c) 如果一個類可序列化,則它的子類和包含的各成員對象也一定可序列化
問題出在了子類,如果子類壓根不能進行序列化操作,則會拋出異常
d) 標識一個類可以序列化要使用[Serializable]
2) 在C#中,下列關於簡單工廠設計模式的說法不正確的是( A )。
a) 簡單工廠產生的對象都是靜態對象
對象沒有靜態和動態之分
b) 創建產品的方法返回類型都是父類
c) 使用該模式解決了代碼中大量使用new 的問題
工廠模式:
單例模式
3個:
簡單工廠
工廠模式
抽象工廠模式
Public class Factory
{
Public static Animal CreateProduct(string type)
{
Animal animal=null;
Return animal;
}
}
原則:開閉原則(對修改關閉,對添加開放)
d) 簡單工廠的缺點是對修改不封閉,新增加產品就需要修改工廠
3) 下列關於虛方法(virtual)和抽象方法(abstract)的描述中錯誤的是( C)。
a) 虛方法必須有方法體,可以被子類重寫
b) 抽象方法不允許有方法體,且必須被子類重寫
c) 抽象方法必須在抽象類中,而虛方法可以在所有類中
密封類和靜態類中不能書寫
d) 在子類中重寫抽象方法或虛方法,都需要用override關鍵字
4) 在UML類圖中使用(B )符號表示私有成員。
a) +
b) -
c) * ~:package
d) # 受保護類型
5) 分析以下使用抽象類的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
6) 下列代碼的運行結果是( 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
7) 關於C#中的虛方法,以下說法正確的是(C )。
a) 使用static修飾
b) 可以沒有方法體
c) 可以被子類重寫
d) 使用abstract修飾
8) 分析如下C#代碼,如果輸出結果是“Dog Eating......”,下劃線需要填寫的代碼是(B )
abstract class Animal
{
public __________ void Eat();
}
class Dog:Animal
{
public __________ void Eat()
{
Console.WriteLine("Dog Eating......");
}
static void Main(string[] args)
{
Animal animal = new Dog();
animal.Eat();
}
}
a) abstract,不填
b) abstract,override
c) virtual,不填
d) virtual,override
9) 在開發C#程式過程中,會大量地使用類和對象,其使用方法不包括( BC)。
a) 將類實例化為對象
b) 將對象實例化為類
c) 通過類訪問非靜態屬性或方法
d) 通過對象訪問非靜態屬性或方法
10) 運行下麵C#代碼將會出現編譯錯誤,出現錯誤的位置是( D)。
class Teacher
{
public Teacher(string name)
{
this.Name = name; //1
}
private string name;
public string Name
{
set { name = value; } //2
}
static void Main(string[] args)
{
Teacher teacher = new Teacher("Jason"); //3
Console.WriteLine(teacher.Name); //4
}
}
a) 1
b) 2
c) 3
d) 4
只有set訪問器,證明只能賦值,不能獲取值
11) 現有類“c1”,它所在的命名空間為“a.b”,則下列說法中錯誤的是(D )。
a) 不同命名空間下仍可存在名稱為c1的類
b) 不同命名空間下使用c1時,可以通過“using a.b”引入命名空間
c) 同一命名空間下的類,使用c1時不需要引入c1的命名空間
d) 不同命名空間下使用c1時,不可以直接通過“a.b.c1”的方式使用
D選項可以但是麻煩
12) 下麵關於泛型集合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){}
13) 已知Company.xml文件節點代碼如下:
<Company>
<Name>一汽大眾</Name><價格>10萬</價格>
<Name>日本豐田Toyota</Name> <價格>20萬</價格>
</Company>
現有如下C#代碼片段:
XmlDocument myXml = new XmlDocument();
myXml.Load("Company.xml");
XmlNode company = myXml.DocumentElement;
foreach(XmlNode node in company.ChildNodes )
{
switch (node.Name)
{
case "一汽大眾": 不是標簽名
Console.WriteLine("車名:{0}", node.InnerText);
break;
case "價格":
Console.WriteLine("價格為:{0}", node.InnerText);
break;
}
}
則正確的輸出結果為(D)。
a) 車名:一汽大眾
價格為:10萬
b) 車名:一汽大眾
價格為:20萬
c) 車名:一汽大眾
車名為:日本豐田
d) 價格為:10萬
價格為:20萬
14) 已知Animal、Cat、Tiger三個類,其繼承關係為Cat: Animal,Tiger: Animal,
已知Animal中成員color的訪問修飾符為protected,Cat中成員height的訪問修飾符為private,Tiger中成員weight的訪問修飾符為public,則下麵描述中錯誤的是( D)。
a) Cat可以訪問Animal中的成員color
b) Cat可以訪問Tiger中的成員weight
c) Tiger可以訪問Animal中的成員color
d) Tiger可以訪問Cat中的成員height
15) 在C#中,( C)關鍵字用於子類的構造函數明確指明調用的父類的構造函數。
a) new 創建對象時使用
b) this 代表當前類的實例
c) base 顯示調用父類的構造方法和父類屬性和常規方法
d) is
16) C#中的多態不能通過(D )實現。
a) 方法重載
方法重載多態的體現!
b) 抽象類
c) 虛方法
d) 密封類 密封類都無法被繼承,何來多態呢?因為我們知道多態的前提是繼承。
17) 分析如下C#代碼片斷,運行後輸出的結果是( C)。
ArrayList list = new ArrayList();
list.Add("Sina");
list.Add("Yahoo");
list.Add("Google");
list.RemoveAt(1);
Console.WriteLine(list[1]);
a) Yahoo
b) Sina
c) Google
d) 代碼出現運行錯誤
List集合會自動調整(維護)索引。
18) 在C#語言中,以下關於集合的說法錯誤的是(A,C)。
a) ArrayList只能通過索引來訪問和刪除值 也可以直接刪除某個對象
b) Hashtable可以直接通過鍵名來獲取值 table[key]
c) 使用List<T>添加、讀取元素時不需要拆箱和裝箱,這一點和ArrayList相同
d) 使用Dictionary<K,V>可以通過Key獲取Value,這一點和Hashtable相同
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
20) 假設要使用C#設計一個日誌系統,要求程式運行時,檢查 system.log 文件是否存在,如果已經存在則直接打開,如果不存在則創建一個,為了實現這個目的,應該以FileMode的(C)方式創建文件流。
a) CreateNew
b) Open
c) OpenOrCreate
d) Create
21) 下麵關於單例模式說法錯誤的是(A)。
a) 在單例模式中,允許通過new 構造實例
b) 單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例
c) 在C# 中,static 是實現單例模式的重要關鍵字
d) 單例模式可以確保所有對象都訪問唯一的實例
22) 下麵不是C#中類的訪問修飾符的是(AD)。
a) protected
b) internal
c) public
d) internal protected
Public在任何位置都可以訪問,甚至是跨程式集都可以訪問,
Internal只能在當前程式集中的任何位置訪問,出了當前程式集,就無法訪問。
在定義內部類的時候可以使用A和D作為類的訪問修飾符
23) 在C#中,下麵關於結構的說法中,正確的是(C)。
a) 結構和類都是引用類型
b) 定義結構的變數必須用new
c) 不能在定義結構時給結構的成員設置初始值
d) 結構中的整型成員被自動初始化為1 自動初始化為0
課本上原話
24) 關於如下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 解析(不可以在父類方法中訪問子類欄位)
25) 關於如下C#代碼的說法中,正確的是(D)。
public class Test //⑴
{
private static int Max = 100; //⑵ 成員變數:
public Test(int max)
{
Max = max; //⑶
}
public int GetMax()
{
return Max; //⑷
}
}
a) 在⑴行中必須將Test類定義為靜態類
靜態變數可以不出現在靜態類中
b) 在⑵中不能將靜態成員Max定義為private的
c) 在⑶中不能給靜態成員Max賦值
d) 在⑷中可以使用靜態成員Max
26) 在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){ …}同一個方法
和返回值類型沒有半毛錢關係
27) 下麵C#代碼執行的結果是(A)。
public class A{ }
public class B : A
{
static void Main()
{
A a = new A();
B b = a as B;
if (b == null)
Console.WriteLine("null");
else
Console.WriteLine(b is A);
}
}
a) null
b) True
c) False
d) 出現異常
28) 如下C#代碼的執行結果是(C)。
public class Test
{
public int i = 1;
public Test(int i)
{
this.i += i;
}
static void Main()
{
Test t = new Test(2);
Console.WriteLine(t.i);
}
}
a) 1
b) 2
c) 3
d) 4
29)有如下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
30) 在C#中,下麵類型中是引用類型的是(CD)。
a) DialogResult枚舉
b) System.Int64
c) string
d) StringBuilder
二 簡答題:
1.請簡述泛型集合List<T>中“T”的含義和作用。並說明List<T>與ArrayList的異同。
要點:
n List<T>中的T可以對集合中的元素類型進行約束;
n T表明集合中管理的元素類型;
n ArrayList與List<T>都使用索引訪問元素;
n ArrayList與List<T>可以通過索引刪除、也可以直接刪除對象;
n ArrayList與List<T>遍歷時直接遍歷元素對象;
n ArrayList獲取元素時需要類型轉換,List<T>不需要類型轉換;
n 同一個ArrayList可以保存不同類型的元素,List<T>只能保存T允許的類型。
2.面向對象的三大特性是什麼?並簡述每個原則的基本功能。
要點:
n 封裝:保證對象自身數據的完整性、安全性;
n 繼承:建立類之間的關係,實現代碼復用,方便系統的擴展;
n 多態:相同的方法調用可實現不同的實現方式。