1. 程式人生 > >重學c#系列——對c#粗淺的認識(一)

重學c#系列——對c#粗淺的認識(一)

### 前言 什麼是c#呢? 首先你是如何讀c#的呢?c sharp?或者c 井? 官方讀法是:see sharp。 有沒有發現開發多年,然後感覺名字不對。 tip:為個人重新整理,如學習還是看官網,c# 文件天下無敵。 ### 正文 c#和java一樣,他們之間有很多故事,尤其是官司,c#同樣是一門面向物件的語言,同樣也支援面向元件程式設計。 複製一下面向物件和麵向元件程式設計的概念: ``` 面向物件技術的基礎是封裝--介面與實現分離,面向物件的核心是多型--這是介面和實現分離的更高階昇華,使得在執行時可以動態根據條件來選擇隱藏在介面後面的實現,面向物件的表現形式是類和繼承。 面向物件的主要目標是使系統物件化,良好的物件化的結果,就是系統的各部分更加清晰化,耦合度大大降低。 面向元件技術建立在物件技術之上,它是物件技術的進一步發展,類這個概念仍然是元件技術中一個基礎的概念,但是元件技術更核心的概念是介面。 元件技術的主要目標是複用--粗粒度的複用,這不是類的複用,而是元件的複用,如一個dll、一箇中間件,甚至一個框架。 一個元件可以有一個類或多個類及其它元素(列舉、)組成,但是元件有個很明顯的特徵,就是它是一個獨立的物理單元,經常以非原始碼的形式(如二進位制,IL)存在。 一個完整的元件中一般有一個主類,而其它的類和元素都是為了支援該主類的功能實現而存在的。 為了支援這種物理獨立性和粗粒度的複用,元件需要更高階的概念支撐,其中最基本的就是屬性和事件,在物件的技術中曾一度困擾我們的類之間的相互依賴問題/訊息傳遞問題,迄今為止我所知道最好的解決方案就是事件。 要理解元件思想,首先要理解事件的思想和機制。 ``` c# 作為一門語言,那麼記憶體管理的關鍵,c#有自動回收機制,為自動回收無法訪問的物件,當然這針對於託管物件,非託管的還需自我管理。 這裡介紹一下非託管物件: ``` 非託管物件指.net不知道如何回收的資源,最常見的一類非託管資源是包裝作業系統資源的物件,例如檔案、視窗、網路連線、資料庫連線、畫刷、圖示等。這類資源,垃圾回收器在清理的時候會呼叫Object.Finalize()方法。 預設情況下,方法是空的,對於非託管物件在此方法中需要編寫回收非託管物件的程式碼,以便垃圾回收器正確回收。(例如我們通常開啟檔案、圖片等後需要進行Close()或者Dispose()去釋放)。 ``` 對於任何一門有垃圾自動回收裝置,非託管資源基本差不多,因為作為託管程式不可能知道你想要啥時候斷開網路連線、啥時候釋放資料庫連線,這些不用去記,如果是主觀因素的基本都是非託管的。 C# 採用統一的型別系統。官方這樣解釋道: ``` 所有 C# 型別(包括 int 和 double 等基元型別)均繼承自一個根 object 型別。 因此,所有型別共用一組通用運算,任何型別的值都可以一致地進行儲存、傳輸和處理。 此外,C# 還支援使用者定義的引用型別和值型別,從而支援物件動態分配以及輕量級結構的內嵌式儲存。 ``` 這個自定義引用型別好理解,這個自定義值型別是那些呢? 自定義值型別就是struct和emun,也就是結構和列舉型別。 但是這個輕量級結構的內嵌式儲存是神馬,我好像沒有用過,只用過內嵌式資料庫sqlite。 ### 案例 #### hello word 既然是重學,那麼就從hello word開始吧。 ``` Console.WriteLine("Hello World!"); ``` 然後輸出: ![](https://img2020.cnblogs.com/blog/1289794/202007/1289794-20200709104927745-1725335963.png) 歡呼,記得在生涯中第一行是用c語言寫的。 #### 宣告和使用變數 ``` string aFriend = "Bill"; Console.WriteLine(aFriend); ``` c# 的官方開源命名是駝峰式的,所以我們一般命名也應該儲存一直。 方法名字首字母大寫,而java則是方法也是駝峰式。 類命名和java一樣是首大寫。 #### 使用字串 ``` string firstFriend = "Maria"; string secondFriend = "Sage"; Console.WriteLine($"My friends are {firstFriend} and {secondFriend}"); ``` 值得關注是內嵌字串,內嵌字串有很多門道的,比如說{}是一個int,那麼就是會引數裝箱和拆箱操作的,我們需要手動tostring。 然後Console.WriteLine 實際上是自動呼叫了tostring方法,如果我們一個類沒有重寫tostring,那麼將會呼叫object的tostring方法。 字串有一些自帶的方法幫我們處理字串。 比如說: ``` string greeting = " Hello World! "; Console.WriteLine($"[{greeting}]"); string trimmedGreeting = greeting.TrimStart(); Console.WriteLine($"[{trimmedGreeting}]"); ``` TrimStart幫助我們去除了前面的空格,但是在刪除後和刪除前是兩個不同的字串,所以我們在頻繁操作字串的時候需要使用StringBuilder, 他會幫我們作為快取,而不是直接去操作字串。 字串物件同樣幫助提供了搜尋字元函式: 如: ``` string songLyrics = "You say goodbye, and I say hello"; Console.WriteLine(songLyrics.StartsWith("you"));//false ``` 幫助查詢是否是You開頭的,StartsWith是區分大小寫的。 當然還有其他的函式如:contains,是否包含等,基本常規操作都有,不常規的就正則表達吧。 ### 總結 上面只是粗淺的認識。但是可以看出c#一些關鍵的地方,垃圾回收、異常處理等一些細節之處。 c# 感覺有一個最大的優點,就是版本控制比較好,不會出現python 這種2和3斷層的存在,語法不會存在很大的差異,一般是引入語法糖和特性,不過c# 9.0的操作跨越時代,幅度有點大,史上最先進的語言,根據以往經驗,基本上其他語言會抄一波的。 ### 疑惑 存在的疑惑: c#的輕量級結構的內嵌式儲存是