C 語言基礎篇

2021-09-02 23:54:39 字數 4322 閱讀 8958

一、型別轉換

在 c# 中,變數分為以下幾種型別:

1.值型別變數可以直接分配給乙個值。它們是從類system.valuetype中派生的。值型別直接包含資料。比如int、char、float,它們分別儲存數字、字元、浮點數。當您宣告乙個int型別時,系統分配記憶體來儲存值。

2.引用型別不包含儲存在變數中的實際資料,但它們包含對變數的引用,指的是乙個記憶體位置。內建的引用型別有:objectdynamicstring

1>物件(object)型別是 c# 通用型別系統(common type system - cts)中所有資料型別的終極基類。object 是 system.object 類的別名。所以物件(object)型別可以被分配任何其他型別(值型別、引用型別、預定義型別或使用者自定義型別)的值。但是,在分配值之前,需要先進行型別轉換。當乙個值型別轉換為物件型別時,則被稱為裝箱;另一方面,當乙個物件型別轉換為值型別時,則被稱為拆箱。(這個在前面的文章有提到過)

2> 可以儲存任何型別的值在動態資料型別變數中。這些變數的型別檢查是在執行時發生的。eg:dynamic a = 100;

3>字串(string)型別允許您給變數分配任何字串值。字串(string)型別是 system.string 類的別名。它是從物件(object)型別派生的。字串(string)型別的值可以通過兩種形式進行分配:引號和 @引號。

c# string 字串的前面可以加 @(稱作"逐字字串")將轉義字元(\)當作普通字元對待,比如:

string str = @"c:\windows";      等價於    string str = "c:\\windows";

string和string的區別:

1> string 是 c# 中的類,string 是 .net framework 的類;(c# string 對映為 .net framework 的string 如果用 string, 編譯器會把它編譯成 string,所以如果直接用 string 就可以讓編譯器少做一點點工作。)

2> string 是關鍵字,string 不是,也就是說 string 不能作為類、結構、列舉、字段、變數、方法、屬性的名稱,而 string 可以。string 是 clr 的型別名稱,而 string 是 c# 中的關鍵字。

3> string 只有在前面有 using system 的時候並且當前命名空間中沒有名為 string 的型別(class、struct、delegate、enum)的時候才代表 system.string。

4>string 在編譯時候 c# 編譯器會預設將其轉換為 string,在這裡會多增加幾行轉換的**。很多時候都是建議使用 clr 的型別而不要使用 c# 的型別。

3.指標型別變數儲存另一種型別的記憶體位址。c# 中的指標與 c 或 c++ 中的指標有相同的功能。eg:  int* iptr;

注:變數的隱式型別轉換zhin只能從低精度到高精度,所以,當乙個精度高的資料型別與乙個精度低的資料型別進行運算時,定義運算結果的變數型別必須與精度最高的變數型別相同。這是為了防止在運算過程中造成資料丟失。否則會出現類似的報錯:無法將型別『double』隱式轉換為『int』。

convert.toint32() 與 int.parse() 的區別:

1>convert.toint32(a),int.parse(a),但是如果a這個引數不存在,那麼前者將返回0,而用後一種辦法的話沒有a這個引數會會丟擲異常,我們可以捕獲異常然後再做相應的處理,比如提示使用者缺少引數,而不是把引數值當做0來處理;

2>對資料的四捨五入有區別:convert.toint32(double value); 如果 value 為兩個整數中間的數字,則返回二者中的偶數;即 3.5轉換為4,4.5 轉換為 4,而 5.5 轉換為 6。 不過4.6可以轉換為5,4.4轉換為4;int.parse(4.5),結果是4,沒有四捨五入。

3>int.parse 是轉換 string為int;convert.toint32是轉換繼承自object的物件為int的(可以有很多其它型別的資料)。

const和readonly區別:

const,在編譯時就確定了值,必須在宣告時就進行初始化且之後不能進行更改,可在類和方法中定義。readonly,在執行時確定值,只能在宣告時或建構函式中初始化,只能在類中定義。

二、封裝

引數傳遞:

c# 中,有三種向方法傳遞引數的方式:

值引數這種方式複製引數的實際值給函式的形式引數,實參和形參使用的是兩個不同記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參資料的安全。

引用引數

這種方式複製引數的記憶體位置的引用給形式引數。這意味著,當形參的值發生改變時,同時也改變實參的值。形參和呼叫時的實參都需要加ref修飾。

輸出引數

這種方式可以返回多個值。形參和呼叫時的實參都需要加out修飾。 out型資料在方法中必須要賦值,否則編譯器會報錯。

三、結構體

四、靜態

可以使用static關鍵字把類成員定義為靜態的。當我們宣告乙個類成員為靜態時,意味著無論有多少個類的物件被建立,只會有乙個該靜態成員的副本。關鍵字static意味著類中只有乙個該成員的例項。靜態變數用於定義常量,因為它們的值可以通過直接呼叫類而不需要建立類的例項來獲取。靜態變數可在成員函式或類的定義外部進行初始化。你也可以在類的定義內部初始化靜態變數。

五、繼承

c#不支援多重繼承,但是可以通過介面實現。

override是重寫,即將基類的方法在派生類裡直接抹去重新寫,故而呼叫的方法就是子類方法;而new只是將基類的方法在派生類裡隱藏起來,故而呼叫的仍舊是基類方法。

六、多型

"乙個介面,多個功能"。在靜態多型性中,函式的響應是在編譯時發生的。在動態多型性中,函式的響應是在執行時發生的。

靜態多型性: c# 提供了兩種技術來實現,分別為:函式過載;運算子過載。

動態多型性:c# 通過抽象類和虛方法實現。

用關鍵字abstract建立抽象類,用於提供介面的部分類的實現。當乙個派生類繼承自該抽象類時,實現即完成。抽象類包含抽象方法,抽象方法可被派生類實現。派生類具有更專業的功能。

抽象類的一些規則:

virtual和abstract的區別:

virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。

virtual可以被子類重寫,而abstract必須被子類重寫。

如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。

無法建立abstract類的例項,只能被繼承無法例項化。

七、介面

介面定義了語法合同"是什麼"部分,派生類定義了語法合同"怎麼做"部分。介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的宣告。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。

1.通過介面可以實現多重繼承,c# 介面的成員不能有 public、protected、internal、private 等修飾符。原因很簡單,介面裡面的方法都需要由外面介面實現去實現方法體,那麼其修飾符必然是 public。

2.c# 介面中的成員預設是 public 的。當乙個介面實現乙個介面,這2個介面中有相同的方法時,可用 new 關鍵字隱藏父介面中的方法。

3.介面一旦被實現,實現類必須實現介面中的所有成員,除非實現類本身是抽象類。

介面和抽象類的區別:

1.介面用於規範,抽象類用於共性。抽象類是類,所以只能被單繼承,但是介面卻可以一次實現多個。

2.介面中只能宣告方法,屬性,事件,索引器。而抽象類中可以有方法的實現,也可以定義非靜態的類變數。

3.抽象類的例項是它的子類給出的。介面的例項是實現介面的類給出的。

4.在抽象類中加入乙個方法,那麼它的子類就同時有了這個方法。而在介面中加入新的方法,那麼實現它的類就要重新編寫。

5.介面成員被定義為公共的,但抽象類的成員也可以是私有的、受保護的、內部的或受保護的內部成員。

持續更新中。。。後續有需要注意的會新增。

參考:

c語言基礎篇(一)

一 基本資料型別 整型 int 實型 float double 字元型 char 這些資料型別是用來修飾 變數 程式執行過程中可以改變的量 二 變數的命名規則 1.以字母丶下劃線開頭,中間可以包含數字,但不能以數字開頭 2.可以使用美元符號開頭 但不建議 3.見名知意 4.不可使用系統保留字 三 賦...

C語言基礎篇 四

include include include 函式的宣告 void changesalar int x void changearray int arr 5 int main int argc,const char argv 基本資料型別陣列 int array1 4 int array2 int...

C語言基礎篇 五

include include struct student 結構體定義一 typedef struct 結構體定義二 newstudent int main int argc,const char argv 注意 結構體定義,在花括號後面加分號 結構體變數初始化 struct 結構體名 變數名 s...