一、C# 專欄
? ? ? ? 由于博主原先是做的Linux C/C++ 嵌入式領域,因此對 C# 也較為懵懂,C# 是典型的 OOP 編程,這一點與 C++ 類似,但是在語法上,C# 移除了對指針的運用以及內存管理,所以既不用考慮指針的復雜運用也不用考慮堆棧內存的手動釋放。
? ? ? ? 現在出于工作需要,不得不學習 C# 語言,但這塊內容的資料我認為是比較有限的,無論是某站,還是二手書,對于深入的內容講得是非常少的,在編程的時候,即便是按需查詢也是相當耗費時間以及很難第一時間全部掌握的,所以開辟此專欄也是為了記錄在學習過程中的涉及到的深入知識點。
? ? ? ? 但為了將一些零碎的知識便于補充,還是在本章中,添加對 C# 基礎知識的記錄。
二、C# 基礎知識
1、C# 標準輸入輸出函數
????????Console 類表示控制臺應用程序的標準輸入流、輸出流和錯誤流。
????????Console 類中與輸入/輸出相關的方法如表所示:
方法 | 說明 |
Read() | 從標準輸入流讀取下一個字符,返回 int 類型,只能記錄 int 類型數據 |
ReadLine() | 從標準輸入流讀取下一行字符,返回值為 string 類型 |
Write() | 將指定的值寫入標準輸出流,輸出后不換行 |
WriteLine() | 將當前行終止符寫入標準輸出流,輸出后換行 |
2、C# 數據類型(補充)
1、變量
????????C# 中的變量類型根據其定義可以分為兩種:一種是值類型,另一種是引用類型。值類型變量直接存儲其數據值,主要包含整數類型、浮點類型以及布爾類型等,值類型變量在棧中進行分配;引用類型是構建 C# 應用程序的主要對象類型數據,在應用程序執行的過程中,預先定義的對象類型以 new 創建對象實例,并且存儲在堆棧中。
1.1)值類型和引用類型
????????值類型變量直接存儲其數據值,主要包含整數類型、浮點類型以及布爾類型等。值類型變量在堆棧中進行分配。當以值類型作函數參數傳遞時,在函數內部改變形參的值,都不會改變實參原本的值。
????????引用類型是構建 C# 應用程序的主要對象類型數據,引用類型必須使用 new 關鍵字來創建引用類型變量。當以引用類型作函數參數傳遞時,需要用到 ref 關鍵字,此時在函數內部改變形參的值,會改變實參原本的值。
1.2)裝箱和拆箱
????????將值類型轉換為引用類型稱為裝箱,反之,將引用類型轉換為值類型稱為拆箱。
1.3)單精度浮點型
????????單精度浮點型 float 的小數精確到第7位,但是 C# 默認小數為 double 型,因此,在需要使用 float 型數據時,需要在數值后面加上 f 或者 F 來強制其值為 float 類型。
1.4)金錢類型 decimal
????????用來存儲小數點超過16位(double)的數據類型:
????????decimal a = 2000m;
????????數據后面必須加一個 m 以區分數據類型,大小寫均可以。
2、整數類型
????????與 C++ 不同的是,C# 中有兩個額外的整數類型:sbyte 表示8位有符號整數,取值范圍為:-128~127 以及 byte 表示8位無符號整數,取值范圍為:0~255。
????????其余與 C++ 類似,只是無符號 unsigned 縮寫為“u”,例如:uint、ushort等。
3、C# 類訪問權限
1、類訪問權限與 C++ 的區別
????????C++中通過 public: 和 private: 的語法批量聲明成員的訪問權限,但 C# 要求每個成員單獨指定訪問修飾符。因此不用添加冒號,而且,默認訪問權限是 private 私有的。
????????例如有:
class Person
{public void func(int a){m_A = a;Console.WriteLine("這是一個C#代碼函數打印 m_A = "+ m_A);Console.ReadKey();}private int m_A;
};
????????C# 的類必須屬于命名空間,沒有全局作用域的類定義。
2、類對象的創建與 C++ 的區別
????????類的創建不能簡單的只創建類對象,而是應當用 new 的關鍵字方式創建。
3、類訪問修飾符(訪問權限)
????????C# 中的訪問修飾符主要包括 private、protected、internal、protected internal 和 public。主要區別如下表所示:
訪問修飾符 | 應用范圍 | 訪問范圍 |
private | 所有類或者成員 | 只能在本類中訪問 |
protected | 類和內嵌的所有成員 | 在本類和其子類中訪問 |
internal | 類和內嵌的所有成員 | 在同一程序集中訪問 |
protected internal | 類和內嵌的所有成員 | 在同一程序集和子類中訪問 |
public | 所有類或者成員 | 任何程序都可以訪問 |
????????需要注意的是,在定義類時,只能使用 public 或者 internal,這取決于是否希望在包含類的程序集外部訪問它。
????????正常情況下不能把類定義為 private、protected 或者 protected internal 類型,但是可以使用它們定義嵌套的內部類(也就是在一個類中再聲明一個類),則內部類總是可以訪問外部的所有成員。
4、C# 數組
1、與 C/C++ 的區別??
????????在 C/C++ 中聲明一個數組時,中括號在數組名字的后面;而在 C# 中聲明一個數組時,中括號在數組元素類型的后面。
????????在 C# 中,聲明數組后,還不能訪問它的任何元素,因為聲明數組只給出了數組名和元素的數據類型,要真正使用數組,還需要為它分配內存空間,在為數組分配內存空間時,必須指明數組的長度,為數組分配內存空間的語法格式如下:
????????數組名稱 = new 數組元素類型[數組元素的個數]
????????也可以在聲明的同時為數組分配內存空間:
????????數組元素類型[] 數組名稱 = new 數組元素類型[數組元素的個數]
2、一維數組的聲明和使用
????????一維數組的聲明語法格式如下:
????????type[] arrayName; //數組元素類型[] 數組名字
????????一維數組的使用例如有:
int[] arr1;
arr1 = new int[10];int[] arr2 = new int[10];
int[] arr3 = new int[10]{1,2,3,4,5,6,7,8,9,10};
int[] arr4 = {1,2,3,4,5,6,7,8,9,10};
????????可以使用 length 屬性來獲取數組的長度:arr1.length。
3、二維數組的聲明和使用
????????二維數組的聲明語法格式如下:
????????type[ , ] arrayName;
????????type[][] arrayName;
????????二維數組的使用例如有:
int[,] a = new int[2,4]; //定義一個兩行四列的 int 類型的二維數組int[][] b = new int[2][];
b[0] = new int[2];
b[1] = new int[3]; //不規則的二維數組int[,] c = new int[,]{{1,2},{3,4}};
4、動態二維數組的聲明和使用
????????動態二維數組的聲明語法格式如下:
????????type[] arrayName;
????????arrayName = new type[n1, n2, n3,,,,,,]
????????動態二維數組的使用例如有:
int m = 2;
int n = 2;
int[,] a = new int[m,n]; // m 和 n 可以是任意值
5、C# 字符與字符串
? ? ? ? C# 的字符類 char 的使用和字符串類 string 的使用與 C++ 類似,不同的是 C# 的字符串類中封裝了一些方法,這可以后續介紹。
6、C# 類
1、類的聲明
????????C# 中,類是使用 class 關鍵字來聲明的,語法如下:
類修飾符 class 類名
{}
2、構造函數和析構函數
????????C# 中的構造函數與析構函數同 C++ 類似,可以參考 C++ 中對象和類的類的構造函數和析構函數。
2.1)私有構造函數
????????與 C++ 不同的是,在定義構造函數時,也可以使用 private 進行修飾,用于表示構造函數只能在本類中訪問,在其它類中不能訪問,但是,如果類中只定義了私有構造函數,將導致類不能使用 new 運算符在外部代碼中實例化。
????????然而,可以通過編寫一個公共的靜態屬性或者方法來解決這個問題,例如有:
class Person
{private Person(){//私有構造函數}public static Person newPerson{return new Person();}static void Main(string[] args){Person p = new Person.newPerson();}
}
????????使用私有構造函數可以實現一種常見的設計模式——單例模式,即同一類創建的所有對象都是同一個實例。
2.2)靜態構造函數
????????在 C# 中,可以為類定義靜態構造函數,這種構造函數只執行一次,編寫靜態構造函數的主要原因是類有一些靜態字段或屬性,需要在第一次使用類之前從外部源中初始化這些靜態字段和屬性。
????????在定義靜態構造函數時,不能設置訪問修飾符,因為其他 C# 代碼從來不會調用它,它只在引用類之前執行一次,另外,靜態構造函數不能帶任何參數,而且一個類中只能有一個靜態構造函數,它只能訪問類的靜態成員,不能訪問實例成員。
????????例如有:
namespace _4._3
{internal class Program{static Program(){Console.WriteLine("靜態構造函數的調用");}private Program() {Console.WriteLine("私有構造函數的調用");}static void Main(string[] args){Program p1 = new Program();Program p2 = new Program();Program p3 = new Program();Console.ReadLine();}}