基礎增強

 

基礎增強程序員

  1. Main函數是什麼?
  2. 在程序中使用Main函數有什麼須要注意的地方?
  3. CLR是什麼?
  4. 程序集是什麼?
  5. 當運行一個程序集的時候,CLR作了什麼事情?
  6. 值類型的默認值是什麼?
  7. 聲明一個變量時在內存中作了什麼事情?
  8. 初始化一個變量的時候又在內存中作了什麼事情?
  9. new關鍵字作的事情?
  10. 數組一旦建立後,能不能修改數組的長度?
  11. 如何聲明一個多維數組?
  12. 如何獲取多維數組的總長度?
  13. 如何聲明一個交錯數組?
  14. 交錯數組的本質是什麼?
  15. 爲何要有方法?
  16. 如何實現方法的重載?
  17. 引用參數(ref)和輸出參數(out)的相同點與不一樣點?
  18. 在什麼狀況下使用引用參數(ref)和輸出參數(out)?
  19. 可變參數與普通數組參數的區別?
  20. 面向對象的三大特徵是什麼?
  21. 類和對象的關係?
  22. 建立某一個類的對象的時候,在內存中作了什麼事情?例如 Person p = new Person();
  23. 屬性存在的目的是什麼?
  24. 訪問修飾符有哪些並分別每個訪問修飾符?
  25. 爲何要有構造函數呢?
  26. 什麼是封裝?
  27. 封裝的目的是什麼?
  28. 類的命名規則是什麼?
  29. 什麼是類型?
  30. this關鍵字在方法中使用時,它表明什麼?
  31. 值類型變量的初始化(內存分配)?
  32. 繼承的好處?
  33. 繼承的單根性
  34. 繼承的傳遞性
  35. 當存在繼承關係的時候,在子類中如何訪問父類的非私有成員?
  36. 什麼是里氏替換原則?
  37. 子類與父類對象之間的轉換?
  38. is 和 as 操做符的用處和區別?
  39. override能夠重寫哪些 "類型" 的方法?
  40. 什麼是多態?
  41. 抽象方法只能定義在抽象類中嗎?
  42. CLR何時加載類?
  43. 當存在繼承關係的時候,建立子類對象的時候會不會建立父類對象呢?
  44. 若是子類和父類存在同名但沒有重寫關係的方法的時候,那麼會調用哪一個方法?
  45. 若是子類和父類存在同名且有重寫關係的方法,那麼會調用那個方法?
  46. 虛方法和抽象方法的相同點與不一樣點?
  47. 子類中的base關鍵字指向的是子類對象仍是父類對象?
  48. 它自己的類型是子類類型仍是父類類型呢?
  49. 爲何要有抽象類?
  50. 使用多態的好處是什麼?
  51. 什麼狀況下的類不能被實例化?
  52. 什麼狀況下抽象類的子類不須要實現父類的抽象成員?
  53. 虛方法(虛擬成員)和抽象方法(抽象成員)能不能被私有化?
  54. 靜態成員能不能被標記爲virtual、override 或 abstract?
  55. 接口的命名規則?
  56. 什麼是接口?
  57. 接口能包含的成員有哪些?
  58. 接口的訪問權限修飾符只能是哪兩種?
  59. 接口能不能實現接口?
  60. 若是一個抽象類繼承了一個接口,那麼將繼承的方法設置爲抽象方法,仍是去實現該方法?
  61. 使用接口應注意什麼事項?
  62. 顯式接口和隱式接口?
  63. 接口與抽象類的區別?
  64. 轉換分類?
  65. ToString()方法?
  66. Parse()和TryParse()方法的區別?
  67. 何時加載靜態成員
  68. 何時用靜態成員
  69. 在普通類和靜態類中的區別
  70. 靜態類的繼承
  71. 類和成員的訪問修飾符
  72. 結構本質是什麼?
  73. 值類型和引用類型的選擇
  74. new關鍵字的做用
  75. 類和結構的區別
  76. 值類型和引用類型做爲參數傳遞的區別
  77. 訪問級別約束
  78. 析構函數
  79. 爲何不能在結構體中定義析構函數
  80. 字符串經常使用方法
  81. ==運算符和Equals()方法的區別
  82. 字符串的恆定性
  83. StringBuilder 和 String 的區別?
  84. 枚舉本質是什麼?
  85. 枚舉項的相關問題
  86. IEnumerable接口
  87. 集合
  88. 動態數組和 泛型集合的不一樣點和優缺點
  89. 泛型list的經常使用方法
  90. 哈希表內部機制原理
  91. 哈希表存取操做原理
  92. 泛型集合引用命名空間
  93. List和ArrayList的性能比較
  94. 應該使用try語句塊的狀況
  95. Windows Form程序相關文件
  96. Path類相關方法
  97. 操做目錄(Directory類)相關方法
  98. 操做文件(File)相關方法
  99. DirectoryInfo(文件夾的一個「類」,用來描述一個文件夾對象)相關方法
  100. using語句的本質
  101. 文件操做注意問題
  102. 序列化和反序列化的區別
  103. Serializable特性
  104. 什麼是委託?
  105. 委託的目的是什麼?
  106. 委託的適用情形?
  107. 冒泡排序?
  108. 匿名方法是什麼?
  109. 多播委託是什麼?
  110. 事件本質是什麼?
  111. 委託和事件的區別是什麼?
  • Main函數是什麼? 
    • 程序的入口點                                                
  • 在程序中使用Main函數有什麼須要注意的地方?
    •  Main函數不能變,有且只有一
  • CLR是什麼?
    • 公共語言運行時
    • Common Language Rentime
  • 程序集是什麼?
    • 編譯後代碼的集合(包括exe和dll);加載項目裏全部的類到內存,並找到其中的主函數,並做爲默認的啓動函數調用執行
  • 當運行一個程序集的時候,CLR作了什麼事情?
    • 加載項目全部的類到內存,並找到其中的主函數做爲默認的啓動函數調用執行,可是,若是項目中,包含一個以上的主函數時CLR不知道從那裏開始,若是項目中,沒有包含主函數的話,CLR也不知道如何啓動
  • 值類型的默認值是什麼?
    • 若是沒有賦值且是全局變量或字段
      • Int默認爲0
      • Bool 默認爲false
      • Eumn
      • 結構體
    • 若是是局部變量就必須賦值
  • 聲明一個變量時在內存中作了什麼事情?
    • 在棧中開闢空間,並將變量放入空間中,默認值爲Null
  • 初始化一個變量的時候在內存中作了什麼事情?
    • 若是是值類型直接放在棧中
    • 若是是引用類型,在堆中開闢空間,將堆中的地址指針放入棧中
  • new關鍵字作的事情?
    • 開闢空間
    • 建立對象
    • 調用構造函數
  • 數組一旦建立後,能不能修改數組的長度?
    • 不能,建立時在內存中開闢了一段連續的空間
  • 如何聲明一個多維數組?
    • string[,] strs={{"1","1"},{"1","1"}};
  • 如何獲取多維數組的總長度?
    • 各個緯度元素的乘積
  • 如何聲明一個交錯數組?
      • int[] [] arr=new int [3] [3];
  • 交錯數組的本質是什麼?
    • 一個數組的數組,也就是數組的元素就是一個一維數組
  • 爲何要有方法?
    • 爲了複用
    • 封裝具體實現
  • 如何實現方法的重載?
    • 方法名相同,方法簽名不一樣,和返回值無關
  • 引用參數(ref)和輸出參數(out)的相同點與不一樣點?
    • 相同點:傳遞的都是引用
    • 不一樣點:out側重於輸出參數,ref側重於修改參數,out必須方法返回前賦值,ref必須在傳入以前賦值
  • 在什麼狀況下使用引用參數(ref)和輸出參數(out)?
    • 若是方法有多個返回值,則能夠用out或者ref。只不過ref側重於修改(即將值傳進去修改後在拿出來),而out是爲了從方法中得到一個值後拿到方法外使用
  • 可變參數與普通數組參數的區別?
    • 必須放在參數列表最後
    • 每一個方法中有且只有一個params
    • 若是沒有給params賦值,長度就自動初始化爲0
  • 面向對象的三大特徵是什麼?
    • 封裝
    • 繼承
    • 多態
  • 類和對象的關係?
    • 類是抽象的,對象是具體的實現
    • 類是用來描述實物的,是針對具體存在的一種描述,對象是這類事務存在的具體實現,按照類的描述來建立一個可供咱們使用的實例
  • 建立某一個類的對象的時候,在內存中作了什麼事情?例如 Person p = new Person();
    • 開闢空間,建立對象,調用構造函數(在內存的堆中開闢空間,建立Person對象,而後在內存的棧中開闢一空間放一個p,而後將Person對象在堆中的引用地址賦值給對象p)
  • 屬性存在的目的是什麼?
    • 封裝字段
    • 爲了對字段的操做設置規則
      • 本質上是兩個方法:get();set();
  • 訪問修飾符有哪些並分別每個訪問修飾符?
    • Public 公有的
    • private 私有的
    • Internal 程序集內共享,若是不寫修飾符默認就是Internal
    • Protected 受保護的
    • Extern 供外部訪問
  • 爲何要有構造函數呢?
    • 主要方便程序員在實例化對象中一些屬性字段初始化賦值
  • 什麼是封裝?
    • 就是把重複的代碼包起來
  • 封裝的目的是什麼?
    • 複用
    • 隱蔽實現
    • 修改方便
  • 類的命名規則是什麼?
    • 帕斯卡方式,首字母大寫
    • 變量,駱駝命名方式,首字母小寫
  • 什麼是類型?
    • 用來定義某一種數據在內存裏開闢空間的大小
  • this關鍵字在方法中使用時,它表明什麼?
    • 所在類的堆裏面的對象
    • this指當前類的對象,或者他的父類的類對象
  • 值類型變量的初始化(內存分配)?
    • 當變量是一個類的成員變量的時候,那麼該變量是跟隨類的對象存在於堆內存,但對象引用斷開時,等垃圾回收器進行清理時便銷燬
  • 繼承的好處?
    • 提升代碼的複用
    • 實現多態
  • 繼承的單根性
    • 一個類只有一個父類
  • 繼承的傳遞性
    • 指子類「得到」父類全部非私有的成員
  • 當存在繼承關係的時候,在子類中如何訪問父類的非私有成員?
    • 當存在繼承關係的時候,子類的this同時能夠指向父類的非私有成員,base就是存在於子類對象裏,用來指向父類對象的指針
  • 什麼是里氏替換原則?
    • 在聲明的時候,子類替換父類所在的位置
  • 子類與父類對象之間的轉換?
    • 子類能夠強轉爲父類,反之沒法實現
  • is 和 as 操做符的用處和區別?
    • is就是出去對類型的判斷,返回true和false。若是一個對象是某個類型或是其父類型的話就返回爲true,不然的話就會返回爲false,is永遠不會拋出異常
    • as關鍵詞只能判斷、轉換引用類型,as首先測試轉換是否合法,若是合法就轉換,不然返回Null。關鍵詞Null表示空引用,不會拋異常
  • override能夠重寫哪些 "類型" 的方法?
    • 虛方法(virtual)
    • 抽象方法(abstract)
  • 什麼是多態?
    • 就是用某個子類來實例化父類,調用的是父類的抽象方法(虛方法),但實際執行的是子類實例重寫的方法
  • 抽象方法只能定義在抽象類中嗎?
    • 抽象方法只能定義在抽象類中
    • 抽象方法必須在子類中實現,除非子類也是抽象類
    • 抽象成員不能是私有的(private)
  • CLR何時加載類?
    • 是在第一次在代碼中遇到這個類的時候才加載類的靜態成員和信息
  • 當存在繼承關係的時候,建立子類對象的時候會不會建立父類對象呢?
    • Person p=new Student()
    • 當咱們new一個子類的時候,在內存中,只有一個子類對象
  • 若是子類和父類存在同名但沒有重寫關係的方法的時候,那麼會調用哪一個方法?
    • 若是子類和父類存在同名但沒有重寫關係的方法,那麼調用時,若是父類變量調用,則調用父類方法,若是是子類變量調用,則調用子類的方法
  • 若是子類和父類存在同名且有重寫關係的方法,那麼會調用那個方法?
    • 若是子類和父類存在同名且有重寫關係的方法,那麼無論變量是什麼類型,調用的都是子類的方法
  • 虛方法和抽象方法的相同點與不一樣點?
    • 相同點
      • 抽象方法和虛方法都能被重寫
      • 都不能爲private
    • 不一樣點
      • abstract和virtual的關鍵字不一樣
      • 抽象方法必定沒有方法體,而虛方法必須有方法體
      • virtual方法的子類能夠重寫父類方法也能夠不重寫,而抽象方法的所在的類的子類必須重寫父類方法
      • 抽象方法必須在抽象類中聲明,而虛方法能夠存在於任何類裏面
  • 子類中的base關鍵字指向的是子類對象仍是父類對象?
    • 子類對象
  • 它自己的類型是子類類型仍是父類類型呢?
    • 父類類型
    • base就是子類對象自己,只不過類型是父類的
  • 爲何要有抽象類?
    • 抽象類存在的目的就是制定規則,而不是具體實現,(爲了約束子類的行爲),具體實現交給子類完成
  • 使用多態的好處是什麼?
    • 低耦合,代碼之間關聯小,便於維護
    • 做用:把不一樣的子類對象都看成父類來看,能夠屏蔽不一樣子類對象之間的差別,寫出通用的代碼,作出通用的編程,以適應需求的不斷變化
  • 什麼狀況下的類不能被實例化?
    • abstart(抽象類)
    • static(靜態類)
    • private(構造函數私有化)
  • 什麼狀況下抽象類的子類不須要實現父類的抽象成員?
    • 子類自己也是抽象類
  • 虛方法(虛擬成員)和抽象方法(抽象成員)能不能被私有化?
    • 不能(編譯報錯)
    • 深層緣由:他們二者存在的目的就是爲了讓子類去重寫,若是私有化了就沒意義了
  • 靜態成員能不能被標記爲virtual、override 或 abstract?
    • 不能
  • 接口的命名規則?
    • I開頭
    • able結尾,表示有什麼能力
  • 什麼是接口?
    • 特殊的抽象類
    • 徹底是爲了約束類的行爲
  • 接口能包含的成員有哪些?
    • 只能有方法、屬性、索引、和事件的聲明
  • 接口的訪問權限修飾符只能是哪兩種?
    • public
    • internal
  • 接口能不能實現接口?
    • 能實現
  • 若是一個抽象類繼承了一個接口,那麼將繼承的方法設置爲抽象方法,仍是去實現該方法?
    • 均可以
  • 使用接口應注意什麼事項?
    • 接口的成員不能加訪問修飾符
    • 接口的成員不能有任何實現
    • 實現接口的子類必須實現接口的所有成員
    • 接口中只有方法、屬性、事件、索引器,不能有字段
    • 一個類能夠同時繼承一個類並實現多個接口,若是一個子類同時繼承了父類A,並實現接口IA,那麼在語法上A必須在寫在IA的前面,由於類是單繼承的,而接口能夠實現多個
    • 向上轉型
    • 單一職責原則:避免定義體積龐大的接口,只把相關聯的一組成員定義的接口中,若是不這樣作就會形成接口污染
  • 顯式接口和隱式接口?
    • 類實現幾口,能夠顯式的實現接口裏的方法,但注意:旦使用顯式接口裏的方法後,那麼該方法只能被接口變量調用
    • IFlyable fly = new Bird();數據庫

    • fly.Fly();  //正確編程

    • Bird fly = new Bird();數組

    • fly.Fly();  //錯誤安全

  • 接口與抽象類的區別?
    • 抽象類:
      • 抽象方法只做聲明,而不包含實現,能夠當作是沒有實現體的虛方法。
      • 抽象類不能被實例化。
      • 抽象類能夠但不是必須有抽象屬性和抽象方法, 可是一旦有了抽象方法, 就必定要把這個類聲明爲抽象類
      • 具體子類必須實現基類的抽象方法
      • 抽象子類能夠實現基類的抽象方法,也能夠不實現。若是不實現,則其具體子類必須實現它們
    • 接口
      • 接口不能被實例化
      • 接口只能包含方法聲明  
      • 接口的成員包括方法、屬性、索引器、事件 
      • 接口中不能包含常量、字段(域)、構造函數、析構函數、靜態成員
      • 接口中的全部成員默認爲public,所以接口中不能有private修飾符
      • 子類必須實現接口的全部成員
      • 一個類能夠直接實現多個接口,接口之間用逗號隔開 
      • 一個接口能夠有多個父接口,實現該接口的類必須實現全部父接口中的全部成員
  • 轉換分類?
    • 隱式轉換
    • 顯示轉換
  • ToString()方法?
    • 是object對象的一個虛方法,若是不重寫就返回類全名稱
    • 能夠重寫該方法
  • Parse()和TryParse()方法的區別?
    • 相同點
      • 都是針對值string類型進行的值類型轉換
    • 不一樣點
      • 返回值不同,Parse返回轉換成功的類型,TryParse返回Bool值
      • Parse轉換失敗會拋異常,TryParse不會拋異常
      • Parse經過返回值返回結果,TryParse經過out返回結果
  • 何時加載靜態成員
    • 在編譯的時候
  • 何時用靜態成員
    • 在整個程序內部共享的數據,一般用作通用工具類,好比SQLHelper類
  • 在普通類和靜態類中的區別
    • 靜態類用state修飾
    • 靜態類不能被實例化
    • 靜態類中只能包含靜態成員
    • 靜態成員屬於類全部,非靜態成員屬於類的實例全部
    • 在實例方法中能夠直接調用靜態成員,而靜態方法中不能直接調用實例方法
    • 靜態類和靜態成員建立後始終使用同一塊內粗,而使用實例的方式會建立多塊內存
    • 靜態構造函數不能有參數,也不能有訪問訪問修飾符(默認是Private)
  • 靜態類的繼承
    • 不能被繼承
    • 只能繼承Object
  • 類和成員的訪問修飾符
    • 類的訪問修飾符只有兩種:public,internal(默認)
    • 成員的訪問修飾符有:public,protected,private(默認)
  • 結構本質是什麼?
    • 結構體的本質是值類型
  • 值類型和引用類型的選擇
    • 值類型:主要是用來封裝一組數據,併爲數據提供一種簡單的處理方式
    • 引用類型:
      • 主要用來封裝數據和行爲
      • 使用面向對象的特徵
      • 當類型中的成員比較多的時候(存放在堆裏)
  • 結構 new關鍵字的做用
    • 使用new關鍵字建立對象後,所用的成員變量都已經存在,並有默認值(值類型);若是沒有用new關鍵字,則須要程序員手動爲用到的成員變量賦值
  • 類和結構的區別
    • 結構是值類型,是分配在內存的棧上的,而類是引用類型,是分配在內存的堆上的
    • 結構不能被繼承,由於結構是值類型,隱式繼承自System.ValueType
    • 結構是值傳遞的(賦值傳遞),而類是引用傳遞的
  • 值類型和引用類型做爲參數傳遞的區別
    • 結構是值傳遞的(賦值傳遞),而類是引用傳遞的
  • 訪問級別約束
    • 子類的訪問級別不能比父類的高
    • 類中的屬性或字段的訪問級別不能比所對應的類型訪問級別高
    • 方法的訪問級別不能比方法的參數和返回值的訪問級別搞,好比當方法的參數傳遞的是一個類的對象時,那麼此時這個類的對象的訪問級別要高於當前方法的訪問級別
  • 析構函數
    • 一個類只能有一個析構函數
    • 沒法繼承和重載析構函數
    • 咱們沒法手動調用析構函數,由於他是被GC自動調用的
    • 析構函數沒有訪問修飾符也不能有參數
    • 不能在結構體中定義析構函數
class MyDispose
{
          ~MyDispose()
        {
            ...//在這裏寫釋放資源的代碼
        }              
}
  • 爲何不能在結構體中定義析構函數
    • 由於結構是值類型,而值類型是存儲在棧彙總的,棧中的數據在用完以後就當即銷燬了,而析構函數就是用淚釋放資源的,通常存儲在堆中的引用類型才須要GC去釋放
  • 字符串經常使用方法
    • (Last)IndexOf:用來查找某個字符或者字符串,在一個特定字符串對象裏的下標
    • SubString:截取
    • Split():根據特定字符來分割字符串,並返回分割後的字符串的數組,能夠用foreach讀取
    • Join:靜態方法
    • Format():靜態方法
    • Replace():替換完要接收,產生一個新的字符串
    • Trim():去首尾空格
  • ==運算符和Equals()方法的區別
    • "=="若是比較的是值類型,則比較兩個對象的值;若是比較的是引用類型,則比較兩個對象的引用地址是否相同
    • Equals()是Object裏的虛方法,默認用==進行比較,可是大部分微軟的類,及用戶定義的類,都重寫了該虛方法,也就是微軟和用戶各自爲本身編寫的Object的子類定義了相等比較規則
  • 字符串的恆定性
    • 當字符串在內存中已經被建立後,程序員在此建立相同值的字符串對象時,CLR作了優化,直接把第一個字符串的引用賦給了第二個變量,也就是說,先後兩個字符串變量保存了相同的字符串對象引用
    • 若是代碼裏是直接將兩個字符串相加,那麼在CLR編譯IL的時候,就會直接將相加拼接後的新字符串做爲變量的值;若是代碼裏是將兩個字符串變量相加的話,那麼,CLR會在編譯IL時,調用string.Concat(string,string)方法來將兩個字符串變量的值拼接,最後返回一個新的字符串變量
  • StringBuilder 和 String 的區別?
    • String在進行運算時(如賦值、拼接等)就會產生一個新的實例,而StringBuilder則不會。因此在大量字符串拼接貨頻繁對某一個字符串及in行操做時最好使用StringBuilder,不要使用String若是要操做一個不斷增加的字符串,儘可能不用String類,改用StringBuilder類
    • 兩個類的工做原理不一樣:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符添加到另外一個字符串上的工做沒錯,可是在.Net框架下,這個操做實在是划不來,由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了很多事件,而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它特工了Append方法,可以在現有對象的基礎上進行 字符串的修改,簡單並且直接,固然,通常狀況下覺察不到這二者的效率差別,但若是你要對某個字符串進行大量的添加操做,那麼StringBuilder類所耗費的事件和String類簡直不是一個數量級的
  • 枚舉本質是什麼?
    • 枚舉的本質就是類
  • 枚舉項的相關問題
    • 若是爲第一個枚舉項賦了一個int值,那麼後面的枚舉項依次遞增
    • 能夠將枚舉強轉成他所表明的int值
    • 由於枚舉項都對應的int值,因此Switch把他當成int看
    • C#的枚舉項都是常量
    • 不能定義方法、屬性、事件
    • 多個枚舉有相同數值時,數值強轉時,會返回其中最後一個枚舉項
    • 枚舉項的數值類型int long shot...
    • 值類型,由於繼承System.ValueType
  • IEnumerable接口
    • 只要實現該接口就可使用foreach(封裝了迭代器)
    • IEnumerable接口主要包含
      • GetEnumerable方法(獲取迭代器)
      • MoveNext方法(檢查是否存在循環的下一個元素)
      • GetCurrent方法(得到當前循環到的元素)
  • 集合
    • 主要分爲非泛型集合和泛型集合
    • 非泛型集合
      • Arraylist
        • 裏面真正存儲數據的是一個Object[]數組,它對應的泛型是List<T>
      • HashTable
        • 非泛型的鍵值對集合,它對應的泛型是Dictionary<TKey,TValue>
    • 泛型集合
      • List<T>
      • Dictionary<K,V>
  • 動態數組和 泛型集合的不一樣點和優缺點
    • 不一樣點
      • 動態數組對元素沒有任何約束,能夠添加任何元素,其根本緣由是內部存儲元素的是一個Object數組
      • 泛型集合是帶元素類型約束的集合
      • 儘量使用泛型集合
    • 優缺點
      • 避免了裝箱、拆箱操做帶來的性能損耗
      • 在添加元素時隨參數類型進行檢查(編譯時就檢查)
  • 泛型list的經常使用方法
    • Add()
    • AddRange()
    • Insert()
    • InsertRange()
    • Remove()
    • RemoveAt()
    • Resverse()
  • 哈希表內部機制原理
    • 內部就是一個結構體數組(bucket)
        private struct bucket
        {
             public object key;
             public object val;
             public int hash_coll;
        }

哈希表存取操做原理網絡

  • 如何存?
    • 下標是根據key的hash值算出來的。當咱們向Hashtable中Add元素時,元素儲存在Hashtable的數組裏的下標是根據添加key的hash值算出來的(但由於hash值取模數組長度,因此確定不會超過當前數組長度)
    • 每一個對象算出的Hashcode並非惟一的,有可能出現多個對象的Hashcode相同
    • 解決機制
      • 再Hash一次
      • 桶裝模式,將兩個相同的Hashcode的對象裝入一個位置
    • 當新增時,Hashtable裏的容器數組已經滿了,則以數組的兩倍擴容
  • 如何取?
    • 當咱們從Hashtable裏取元素時(根據key來取),會根據key的hash值算出要取的元素的下標,並比較元素裏的key和當前要找的key參數的hash值是否相等,同時還要比較兩個key的引用是否一致,若是都知足,則肯定找到要取的元素
  • 泛型集合引用命名空間
  • System.Collections.Generic
  • List和ArrayList的性能比較
  • 避免裝箱、拆箱操做帶來的性能損耗
  • 在添加元素時隨參數類型進行檢查(編譯時檢查)
  • 應該使用try語句塊的狀況
  • 網絡操做、文件操做、數據庫操做、除法操做、強制類型轉換操做
  • Windows Form程序相關文件
  • designer.cs 設計類和前臺兩個類是兄弟類的關係
  • Path類相關方法
  • ChangeExtension(修改文件的後綴,「修改」支持字符串層面的,沒有真的給文件更名)
  • Combine(將兩個路徑合成一個路徑【自動處理路徑分隔符的問題】)
  • GetDirectoryName(獲得文件的路徑名)
  • GetExtension(獲得文件的擴展名)
  • GetFileName(獲得文件路徑的文件名部分)
  • GetFileNameWithoutExtension(獲得去除擴展名的文件名)
  • GetFullPath(獲得文件的全路徑,能夠根據相對路徑得到絕對路徑)
  • GetTempFileName(獲得一個惟一的臨時文件名)
  • GetTempPath(獲得臨時文件夾的路徑)
  • 操做目錄(Directory類)相關方法
  • Delete(刪除目錄【recursive表示是否遞歸刪除】)
  • Exists(判斷目錄是否存在)
  • move(移動)
  • GetDirectories(獲得一個目錄下的子目錄)
  • GetFiles(獲得一個目錄下的文件)
  • 操做文件(File)相關方法
  • AppendAllText(將文本contents附加到文件path中【若是文件不存在,則建立】)
  • Exists(判斷文件path是否存在)
  • ReadAllLines(讀取文本文件到字符串數組中)
  • ReadAllText(讀取文本文件到字符串中)
  • WriteAllText(將文本contents保存到文件path中,會覆蓋舊內容)
  • WriteAllLines(將字符串數組逐行保存到文件path中,會覆蓋舊內容)
  • Copy(文件拷貝【true表示當文件存在時「覆蓋」,若是不加true,則文件存在報異常】)
  • Create(建立文件)
  • Delete(若是文件不存在?不存在,不報錯)
  • DirectoryInfo(文件夾的一個「類」,用來描述一個文件夾對象)相關方法
  • GetParent(獲得目錄的父目錄)
  • using語句的本質
  • 就是一個try finally
  • 全部要使用using關鍵字來釋放資源的類都必須實現IDisposable接口
  • 文件操做注意問題
  • 當使用文件流的時候,在關閉流的時候數據纔會保存到文件中
  • Close執行了Dispose()並回收對象
  • 全部要使用using關鍵字來釋放資源的類都必須實現IDisposable接口
  • 獲取當前exe文件執行的路徑用(Assemby.GetExecutingAssembly().Location不要用Directory.GetCurrentDirectory(),由於獲取的是程序當前工做目錄,這個路徑可能會變
  • 序列化和反序列化的區別 
  •  序列化
    • 又叫作二進制格式化器,將對象轉換成文本--字段、字段值、類名
    • Serialize(對象graph序列化到stream中)
  • 反序列化
    •  按照文本(字段、字段值、類名)信息裏的類名,使用反射技術建立新對象,並將對一個的字段值設置到新的對象中
    • Deserialize(將對象從stream中反序列化,返回值爲反序列化獲得的對象)
  • Serializable特性
  • 要序列化的類型必須標記爲:[Serializable]
  • 該類型的父類也必須標記爲:[Serializable]
  • 該類型中的全部成員的類型也必須標記爲:[Serializable]
  • 序列化只會對類中的字段序列化(只能序列化一些狀態信息)
  • 什麼是委託?
  • 就是一個可以存放與委託類具備相同簽名方法的「方法集合」
  • 委託本質上就是一個類,繼承與MulticastDelegate→Delegate(在Deleagate類中有一個IntPtr類)
  • 委託就是一個存放方法指針的容器,是一個安全的函數指針
  • 委託的目的是什麼?
  • 可以將方法做爲參數傳遞
  • (多播委託)調用一個委託,執行N個方法
  • 委託的適用情形?
  • 當方法傳遞的參數爲一個方法時,就用委託
  • 冒泡排序?
  • for(int j=0; j<nums.Length-1; j++)
        {
            for(int i=0;i<nums.Length-1-j;i++)
            {
                if(nums[i]>nums[i+1])
                {
                    int temp=num[i];
                    nums[i]=nums[i+1];
                    nums[i+1]=temp;
                }
            }
        }
  • 匿名方法是什麼?
  • 並非真沒有名字,它在CLR編譯時會產生一個臨時方法名
  • 匿名方法產生後,方法指針會存放在委託變量中,供程序調用
  • 多播委託是什麼?
  • 能夠向委託上註冊多個方法
  • 也能夠從委託上移除註冊方法
  • 若是委託上註冊了多個有返回值的方法,那麼在調用以後委託返回的是最後一個方法的返回值
  • 事件本質是什麼?
  • 本質就是提供一個Add和Remove方法的委託對象
  • 是爲了約束一個委託對象的操做方法,對外只提供+=和-=操做
  • 觀察者模式就是事件的體現
  • 委託和事件的區別是什麼?
  • 委託和事件沒有可比性,由於委託是類型,事件是對象
  • 下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別
    • 事件的內部是用委託實現的,由於對於事件來講,外部只能「+=註冊本身」、「-=註銷本身」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,由於若是Delegate就無法進行上面的控制,由於誕生事件這種語法,事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能Add,Remove本身,不能賦值。事件只能+=、-=不能=
相關文章
相關標籤/搜索