1、下列有關基本類的大小不正確的是
A、int類型是4個字節
B、bool類型是1個字節
C、long類型是8個字節
D、char類型是一個字節
3、有關數組說法不正確的是
A、數組的內存是分配在棧中 堆
B、數組的索引從零開始的
C、數組是一種數據結構,它包含若干相同的類型的變量
D、數組可以是一維、多維、交錯的
4、有關結構體說法不正確的是
A、在結構體聲明中,除非字段被聲明為const或static,否則無法初始化
B、結構體不能聲明默認的構造函數(沒有參數的構造函數)或析構函數
由於結構的副本由編譯器自動創建和銷毀,因此不需要使用默認構造函數和析構函數。實際上,編譯器通過為所有字段賦予默認值來實現默認構造函數。 結構是值類型。那么如果從結構創建一個對象並將該對象賦給某個變量,則該變量包含結構的全部值。復制包含結構的變量時,將復制所有數據,對新副本所做的任何修改都不會改變舊副本的數據。由於結構不使用引用,因此結構沒有標識;無法區分具有相同數據的兩個值類型實例。
C、結構體不能從類或其他結構體繼承
所有結構體都繼承ValueType父類,但它們本身不能被其它類繼承。
C#中的父類與子類的繼承關系與C和C++中的類似,這里先闡述最重要的一點:假如子類繼承了父類,那么子類可以強制轉換為父類,並且保證編譯和運行都不出錯;但是父類強制轉換成子類的時候,編譯可以通過運行通不過。
實際上:將子類強制轉換為父類之后,在用這個父類強制轉換為另外一個子類的時候編譯和運行也都能通過;只是如果將父類直接轉換為子類的時候運行會出錯。這就好比:假設父類是一個裝了5個“蘋果”的“小型籃子”,而子類則是一個裝了5個“蘋果”和5個”西瓜“的大型籃子;將子類強制轉換為父類<=>把父類的”小型籃子“換成”大型籃子“,但還是只裝5個”蘋果“(將父類的引用指向子類,但父類只能調用父子自身的變量和方法),之后再用這個父類強制轉換為另外一個子類<=>向”大型籃子“里面裝入5個”西瓜“送給子類的引用;而將父類直接轉換為子類<=>用父類的”小型籃子“裝”5個蘋果和5個西瓜“送給子類的引用(當然是裝不下)
另外一個值得非常注意的地方是:無論是子類強制轉換賦給父類,還是父類(由子類強轉得到)強制轉換為子類;類對象是根據聲明的類型(子類或父類)去調用其變量和函數的,與賦值無關。
可以看出:類的實例對象在調用其變量和方法時,確實是以 聲明 成為的類為依據的。
D、結構體是引用類型的 (值 結構體是值類型的 類是引用類型的)
5、有關結構體和類的說法不正確的是
A、結構是值類型的,而類是引用類型的
B、結構體不可以聲明構造函數(可以申明非默認的構造函數)
C、結構體直接繼承System.ValueType類型
D、結構體可以繼承接口
public struct MyS : IStruct { public void SayHello() { Console.WriteLine("Hello"); } } public interface IStruct { void SayHello(); }
可以說結構體和類一樣,只不過結構體中定義的變量或者方法的默認訪問屬性是public的,而類是private的
6、有關類和結構體的區別說法不正確的是
A、結構體是值類型的,而類是引用類型的
B、類的實例化需要new,而結構體可以不用
C、結構體內存一定分配在棧中,而類的內存分配在堆中
(
使用malloc函數新建一個結構體是在堆上分配的,。
)
D、結構可用作可為null的類型,因而可向其賦值null
7、關於靜態類說法不正確的是
A、聲明靜態類,該類不能使用new關鍵字創建實例
B、靜態類僅包含靜態成員(對)
C、靜態類不能包含常量成員
D、靜態類是密封的(對)
- 靜態類可以有靜態構造函數,靜態構造函數不可繼承。
靜態類的主要特性:
1:僅包含靜態成員。
2:無法實例化。
3:是密封的,不能被繼承。
4:不能 包含實例構造函數。
靜態類主要是共享,靜態類內部成員必須是靜態的。
靜態一般在程序加載的時候被構造。
我個人用靜態類最多的地方的是程序配置部分,因為他的共享特性,在多個窗體中都需要調用,更主要的就是他在程序啟動的時候就被初始化了。
靜態類可以有構造函數,但是只被調用一次。
就上面說的程序配置數據部分,如果使用非靜態類,那么你需要在任何有可能訪問到他的代碼前手動初始化他,並且還要將他賦給一個靜態變量后才能使用。
費事不費事另說,假若你需要在他構造前某個位置來調用它,那還需要修改你構造他的代碼的位置。
非靜態類使用完成后系統會自動銷毀釋放,所以非靜態類相對來說比較安全,而靜態類是在程序結束后銷毀的,在銷毀前一直駐留在內存中,因此出現錯誤的可能性會大些。
建議不要過多的使用靜態類,適時使用。
靜態類
非靜態成員(字段、屬性、和方法)或者非常量是屬於類的實例的。
靜態類是密封的。也不能被繼承
靜態構造函數的調用不是由用戶自己調用的,而是系統系統調用的。
靜態類不能調用析構函數。
8、有關靜態成員說法不正確的是
A、可以使用類的實例,訪問本身類的靜態的成員
B、靜態方法可以被重載,但不能被重寫
C、靜態成員在第一次被訪問之前並且在任何靜態構造函數之前初始化
D、可以在類中聲明靜態成員
無法使用類的實例去訪問靜態成員,靜態成員不是不屬於類的對象的
靜態方法不能標記為override virtual abstract
9、有關委托的說法不正確的是
A、一旦為委托分配了方法,委托與該方法具有完全相同的行為
B、委托是一種引用方法的類型
C、委托可以鏈接在一起,方法不必與委托簽名完全匹配
D、委托就是事件一種表示形式
委托是引用類型
10、delegate void Del(int x);
void DoWork(int k);
下列關於委托訂閱不正確的是
A、Del d=DoWork;
B、Del d=new Del(DoWork);
C、Del d+=DoWork
D、Del d=delegate(int x){DoWork(x);};
11、有關靜態構造函數說法不正確的是
A、靜態構造函數既沒有訪問修飾符,也沒有參數
B、在創建第一個實例前或引用任何靜態成員之前,將自動調用靜態構造函數來初始化。
C、在程序中,用戶可以控制何時執行靜態構造函數
D、無法直接調用靜態構造函數
靜態構造函數必須沒有參數
12、有關absract關鍵字說法不正確的是
A、absract用於創建僅用於繼承用途的類和類的成員
B、absract用於方法,則該方法隱含是虛函數
C、absract用於類,則此類無法被實例化
D、absract用於方法,則該方法有方法體
虛方法virtual的意思是子類可以重寫,抽象方法abstract是子類必須重寫。
抽象方法必須能被繼承
13、有關繼承需要用的關鍵字說法不正確的是
A、virtual用於修飾方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。
B、virtual可以和static、abstract、private、override修飾符一起使用。
C、override關鍵字提供從基類繼承的成員的新的實現,重寫的基類方法必須是virtual、abstract、或override關鍵字修飾的。
D、Sealed用於修飾類時,將會阻止其他類從該類派生
14、有關索引器說法不正確的是
A、索引器允許類或結構體的實例就像數組一樣進行索引
B、索引器類似於屬性,不同之處在於他們的訪問器采用參數
C、索引器不可被重載
D、索引器不必根據整數值進行索引,由你決定如何定義特定的查找機制
Public int this[int index]
{
set{}
get{}
}
索引器(Indexer)
是C#引入的一個新型的類成員,它使得類中的對象可以像數組那樣方便、直觀的被引用。索引器非常類似於屬性,但索引器可以有參數列表,且只能作用在實例對象上,而不能在類上直接作用。定義了索引器的類可以讓您像訪問數組一樣的使用 [ ] 運算符訪問類的成員。(當然高級的應用還有很多,比如說可以把數組通過索引器映射出去等等)
本文只是簡單演示一下索引器的概念和基本的使用方法:
請看代碼,下面是類的定義,中間包含了一個索引器定義
[csharp] view plain copy
1. 類的定義
2. public class Person
3. {
4. //定義兩個字段信息
5. private string name;
6. private string password;
7.
8. //定義一個 Name 屬性來操作 name 字段
9. public string Name
10. {
11. set { name = value; }
12. get { return name; }
13. }
14.
15. //定義一個 Password 屬性來操作 password 字段
16. public string Password
17. {
18. set { password = value; }
19. get { return password; }
20. }
21.
22. //定義索引器,name 字段的索引值為 0 ,password 字段的索引值為 1
23. public string this[int index]
24. {
25. get
26. {
27. if (index == 0) return name;
28. else if (index == 1) return password;
29. else return null;
30. }
31. set
32. {
33. if (index == 0) name = value;
34. else if (index == 1) password = value;
35. }
36. }
37. }
下面是使用索引器的方法:
[csharp] view plain copy
1. 索引器使用
2. protected void Page_Load(object sender, EventArgs e)
3. {
4. //聲明並實例化這個類
5. Person p = new Person();
6.
7. //使用索引器的方式來給類的兩個屬性賦值
8. p[0] = "jarod";
9. p[1] = "123456,./";
10.
11. //使用類屬性取得兩個字段信息
12. Label1.Text = p.Name + " / " + p.Password;
13. }
非常簡單,在上面的類中我們把類的 name 字段映射的索引值為 0,而password 字段映射的索引值為 1。有了這個映射就可以使用以下方式為類的 name 和 password 賦值了。
p[0] = "jarod"; //設置 name 字段值
p[1] = "123456,./"; //設置 password 字段值
賦值后,就可以使用屬性方法訪問到剛剛給兩個字段賦的值了。
15、在C#中,下列常量定義正確的是( )
A、Const double PI 3.1415926;
B、Const double e=2.7
C、define double PI 3.1415926
D、define double e=2.7
16、以下c#代碼:
usingSystem.Threading;
class App{
public static void Main(){
Timertimer = new Timer(new TimerCallback(CheckStatus),null,0,2000);
Console.Read();
}
static void CheckSatus(Object state){
Console.WriteLine("正在進行檢查...")
}
}
在使用代碼創建定時器對象的時候,同時指定了定時器的事件,運行時將每隔兩秒打印一行“正在運行檢查...”,因此,TimerCallback是一個( )
A.委托
B.結構
C.函數
D.類名
21、以下的C#代碼段:
public struct Person{
string Name;
int Age;
}
public static void Main(){
Hasbtable A;
Person B;
//其他處理代碼
}
以下說法正確的是( )。(選擇一項)
A.A為引用類型的變量,B為值類型的變量
B.A為值類型的變量,B為引用類型的變量
C.A和B都是值類型的變量
D.A和 B都是引用類型的變量
24、在C#語言中,下列關於屬性的描述正確的是( ).(選擇一項)
A.屬性系是以public關鍵字修飾的字段,以public關鍵字修飾的字段也可稱為屬性
B.屬性是訪問字段值的一種靈活機制,屬性更好地實現了數據的封裝和隱藏
C.要定義只讀屬性只需在屬性名前加上readonly關鍵字
D.在C#的類中不能自定義屬性
28、閱讀以下的C#代碼:
class A{
public A( ) {
Console.WriteLine("A");
}
}
class B:A{
public B(){
Console.WriteLine("B");
}
}
class Program{
public static void Main(){
B b = new B();
Console.ReadLine();
}
}
上述代碼運行后,將在控制台窗口輸出( )。
A. A
B. B
C. A B
D.B A
29、在.NET中,以下關於命名空間的描述,正確的是( )。
A.命名空間不可以進行嵌套
B.任一個.cs文件中,只能存在一個命名空間
C.便用private修飾的命名空間,其內部的類也不允許訪問
D.命名空間使得代碼更加有條理、結構更清晰
30、NET中,程序中的錯誤可以划分為以下三類,除了( )。
A.邏輯錯誤
B.運行時錯誤
C.語法錯誤
D.自定義錯誤
31、針對下面的C#代碼:
using System;
delegate void D(int i);
class P{
public static void Main(){
V(new D(R)); new D(P.R)
}
public static void R(int t) {
V(21);
}
public static void V(int i){
Console.WriteLine(i.ToString());
Console.ReadLine();
}
}
以下說法正確的是( )
A.代碼中存在錯誤,delegate voidD(int i);不能定義在名稱空間或者類之外
B.代碼中存在錯誤,代碼行V(new D(R));使用委托錯誤
C.程序正常運行,輸出為0
D.程序正常運行,輸出為21
46、下列關於 C# 中索引器理解正確的是 (c)
A、索引器的參數必須是兩個或兩個以上
B、索引器的參數類型必須是整數型
C、索引器沒有名字
D、以上皆非
47、以下關於 ref 和 out 的描述哪些項是正確的? ( 多選 ) ( ACD )
A、使用 ref 參數,傳遞到 ref 參數的參數必須最先初始化。
B、使用 out 參數,傳遞到 out 參數的參數必須最先初始化。
C、使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。
D、使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法
48、以下敘述正確的是: (B C )
A、接口中可以有虛方法。
B.、一個類可以實現多個接口。
C.、接口不能被實例化
D.、接口中可以包含已實現的方法。
49、下哪些可以作為接口成員? ( 多選 ) ( ABDE )
A、方法
B、屬性
C、字段
D、事件
E、索引器
50、在C#中,下列代碼的運行結果是(D)。(選擇一項)
Int[]num = new int[5]{1,3,2,0,0}
Array,Reverse(num);
Foreach(intI in num){
Console.Write(i);
}
A.00123
B.12300
C.00132
D.00231
51、在C#中,(c)訪問修飾符修飾的變量只能由當前程序集訪問。
A.public
B.protected
C.internal
D.private
52、下列屬性定義不正確的是C
A、public int ID{get;set;}
B、public int ID{get; private set;}
C、public int ID{get;}
D、prviate int id=0;public intID{get{return id;}{set{id=value;}}}
53、有關lock關鍵字理解不正確的是D
A、lock關鍵字是將語句標記為臨界區,方法是獲取給定的對象的互斥鎖,執行該語句,然后釋放該鎖。
B、lock關鍵字可確保當一個線程位於代碼的臨界區時,另一個線程不會進入該臨界區,如果其他線程試圖進入鎖定的代碼,則它將一直等待,直到該對象釋放。
C、lock其實就是Monitor,在代碼開始處調用Enter,而在塊的結尾調用Exit
D、在程序中鼓勵使用lock(this)、lock(typeof(MyType))、Lock(“myLock”)
54、有關接口的實現說法不正確的是C
A、實現接口的類,類中對應的成員必須是公共的、非靜態的,並且與接口成員具有相同的名稱和簽名
B、接口實現分位顯示實現和隱式實現
C、如果類繼承多個接口,並且含有具有相同成員名稱的兩個接口,如果我們實現接口成員的話,必須使用顯示實現接口的方式
D、類的屬性和索引器可以為接口上定義的屬性或索引器定義額外的訪問器
55、有關接口的理解不正確的是C
A、不能實例化接口
B、接口不包括方法的實現
C、接口可以包含事件、索引器、方法、屬性、字段
D、類和結構可以從多個接口繼承
56、有關接口說法不正確的是C
A、接口可以繼承接口
B、類可以繼承接口
C、結構體不能繼承接口
D、繼承接口的任何非抽象類型都必須實現接口的所有成員
57、常用的字符串判空串方法:( A)
A、bool isEmpty = (str.Length==0)
B、bool isEmpty = (str==String.Empty)
C、bool isEmpty = (str=="")
D、都一樣
58、在C#中,關於Array和ArrayList的維數,以下說法正確的是(A)。(選擇一項)
A. Array可以有多維,而ArrayList只能是一維
B.Array只能是一維,而 ArrayList可以有多維
C.Array和 ArrayList 都只能是一維
D. Array和ArrayList都可以是多維
59、在C#中,下列代碼運行后,變量Max的值是(C)(選擇一項)Int a=5,b=10,c=15,Max=0;
Max =a>b?a:b;
Max =c<Max?c:Max;
A.0
B.5
C.10
D.15
60、接口是一種引用類型,在接口中可以聲明(a),但不可以聲明公有的域或私有的成員變量
A、方法、屬性、索引器和事件;
B、方法、屬性信息、屬性;
C、索引器和字段;
D、事件和字段;
61、以下是一些C#中的枚舉型的定義,其中錯誤的用法有()
a)public enumvar1{ Mike = 100, Nike = 102, Jike }
b)public enumvar1{ Mike = 100, Nike, Jike }
c)public enum var1{ Mike=-1 , Nike, Jike }
d)public enum var1{ Mike , Nike , Jike }
62、下列關於構造函數的描述正確的是(c)
A、構造函數可以聲明返回類型。
B、構造函數不可以用private修飾
C、構造函數必須與類名相同
D、構造函數不能帶參數
63、在.Net中,關於CLR和IL,以處描述正確的是(D)(選擇一項)
A.應用程序在CLR環境被編譯成IL,IL將能夠被任何計算機指令性集成
B..應用程序被編譯兩次,第一次生成IL,IL在運行時候被CLR快速編譯
C.應用程序被編譯兩次,但是第二次CLR編輯比第一次慢
D.借助CLR,IL被編譯成機器代碼並且能夠在不同的計算機指令集下被執行
64、CLR為.NET提供以下方面的功能或者服務.除了(D)。(選擇一項)
A.無用存儲單元收集
B.代碼驗證和類型安全
C.代碼訪問安全
D.自動消除程序中的邏輯錯誤
65、有關fixed關鍵字說法不正確的是C
A、fixed語句禁止垃圾回收器重定位可移動的變量
B、fixed語句只能出現在不安全上下文中
C、fixed語句可以在數據結構或類中創建帶有固定大小數組的緩沖區
D、fixed語句用於創建固定數組時,數組類型只能是bool、byte、char、short、int、long、sbyte、ushort、uint、ulong、float、double中的一種。
66、下列那個類型是引用類型的是C
A、enum類型
B、struct類型
C、String類型
D、int類型
67、有關屬性(System.Attribute)是用於P/Invoke的屬性類型是C
A、CoditionalAttribute
B、ObsoleteAttribute
C、DllImportAttribute
D、AttributeUsageAttribute
68、有關屬性(System.Attribute)是根據預處理標識符執行方法的屬性類型是C
A、CoditionalAttribute
B、ObsoleteAttribute
C、DllImportAttribute
D、AttributeUsageAttribute
69、有關異步委托Control.BeginInvoke(界面)和myDelegate.BeginInvoek實現方式說法正確的B
A、Conrol.BeginInvoek和MyDelegate.BeginInvoek都是使用PostMessage發送消息。
B、Conrol.BeginInvoek是使用PostMessage發送消息,MyDelegate.BeginInvoek是使用線程池的
C、Conrol.BeginInvoek和MyDelegate.BeginInvoek都是使用線程池的
D、Conrol.BeginInvoek是使用線程池的,MyDelegate.BeginInvoek是使用PostMessage發送消息
70、& 和&&的區別是A
A、&是算術”與”運算符,用於整形和bool;&&是條件”與”運算符,僅用於bool
B、&和&&是算術”與”運算符,用於整形和bool
C、&&是算術”與”運算符,用於整形和bool;&是條件”與”運算符,僅用於bool
D、&和&&是條件”與”運算符,僅用於bool