重學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!");

然後輸出:

歡呼,記得在生涯中第一行是用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#的輕量級結構的內嵌式存儲是什麼呢?