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

團隊buff工具人發表於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!");

然後輸出:

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

相關文章