重學c#系列——對c#粗淺的認識(一)
阿新 • • 發佈:2020-07-09
### 前言
什麼是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#的輕量級結構的內嵌式儲存是