官术网_书友最值得收藏!

第3章 C#語言基礎
視頻講解:1小時43分鐘)

很多人認為學習C#之前必須要學習C++,其實并非如此,產生這種錯誤的認識是因為很多人在學習C#之前都學過C++。事實上,C#比C++更容易掌握。要掌握并熟練應用C#,就需要對C#語言基礎進行充分的了解。本章將對C#語言的基礎語法進行詳細的講解,對于初學者來說,應該對本章的各個小節進行仔細地閱讀和深入的思考,這樣才能達到事半功倍的效果。

通過學習本章,讀者主要掌握以下內容:

變量的定義及使用

熟練掌握基本的數據類型

熟悉變量的作用域

常量的概念及分類

熟練掌握兩種不同的數據類型轉換

3.1 為什么要使用變量

視頻講解

變量關系到數據的存儲,計算機是使用內存來存儲計算時所使用的數據,那么內存是如何來存儲數據的呢?通過生活常識,我們知道數據是各式各樣的,比如整數、小數、字符串等,那么,在內存中存儲這些數據時,就首先需要根據數據的需求(即類型)為它申請一塊合適的空間,然后再在這個空間中存儲相應的值。實際上,內存就像一個賓館,客人如果到一個賓館住宿,首先需要開房間,然后再入住,而在開房間時,客人需要選擇是開單人間、雙人間還是總統套房等,這其實就對應一個變量的數據類型選擇問題。

在內存中為數據分配一定的空間之后,如果要使用定義的這個數據,由于內存中的數據是以二進制格式進行存儲的,而這些二進制數據都對應相應的內存地址,因此,必須要通過一種技術使用戶能夠很方便地訪問到二進制數據的內存地址,這種技術就是變量!

3.2 變量是什么

視頻講解

變量主要用來存儲特定類型的數據,用戶可以根據需要隨時改變變量中所存儲的數據值。變量具有名稱、類型和值,其中,變量名是變量在程序源代碼中的標識,類型用來確定變量所代表的內存的大小和類型,變量值是指它所代表的內存塊中的數據。在程序執行過程中,變量的值可以發生變化。使用變量之前必須先聲明變量,即指定變量的類型和名稱。

這里以上面的客人入住賓館為例,說明一個變量所需要的基本要素。首先,客人需要選擇房間類型,也就是確定變量類型的過程;選擇房間類型后,需要選擇房間號,這是確定變量的名稱;完成以上操作后,這個客人就可以順利入住,這樣,這個客人就相當于這個房間中存儲的數據,示意圖如圖3.1所示。

圖3.1 變量的基本要素

3.3 變量的聲明及初始化

視頻講解

好比一個新生兒必須有一個名字一樣,使用變量時,也需要首先對變量進行命名,對變量命名的過程,其實就是聲明一個變量。變量在使用之前,必須進行聲明并初始化,本節將對變量的聲明、簡單數據類型、變量初始化,以及變量的作用域進行詳細講解。

3.3.1 聲明變量

1. 聲明變量

聲明變量就是指定變量的名稱和類型,變量的聲明非常重要,未經聲明的變量本身并不合法,也無法在程序中使用。在C#中,聲明一個變量是由一個類型和跟在后面的一個或多個變量名組成,多個變量之間用逗號分開,聲明變量以分號結束,語法如下:

例如,聲明一個整型變量mr,然后再同時聲明3個字符串變量mr_1、mr_2和mr_3,代碼如下:

2. 變量的命名規則

在聲明變量時,要注意變量的命名規則。C#的變量名是一種標識符,應該符合標識符的命名規則。另外,需要注意的一點是:C#中的變量名是區分大小寫的,比如num和Num是兩個不同的變量,在程序中使用時是有區別的。以下為變量的命名規則:

  •  變量名只能由數字、字母和下畫線組成。
  •  變量名的第一個符號只能是字母和下畫線,不能是數字。
  •  不能使用C#中的關鍵字作為變量名。
  •  一旦在一個語句塊中定義了一個變量名,那么在變量的作用域內都不能再定義同名的變量。

例如,下面的變量名是正確的:

下面的變量名是不正確的:

說明

在C#語言中允許使用漢字或其他語言文字作為變量名,如“int年齡=21”,在程序運行時并不出現什么錯誤,但建議讀者盡量不要使用這些語言文字作為變量名。

3.3.2 簡單數據類型

前面提到,聲明變量時,首先需要確定變量的類型,那么,開發人員可以使用哪些類型呢?實際上,可以使用的變量類型是無限多的,因為開發人員可以通過自定義類型存儲各種數據,但這里要講解的簡單數據類型是C#中預定義的一些類型。

C#中的數據類型根據其定義可以分為兩種,一種是值類型,另一種是引用類型。從概念上看,值類型是直接存儲值,而引用類型存儲的是對值的引用。C#中的數據類型結構如圖3.2所示。

圖3.2 C#中的數據類型結構

從圖3.2可以看出,值類型主要包括簡單類型和復合類型兩種,其中簡單類型是程序中使用的最基本類型,主要包括整數類型、浮點類型、布爾類型和字符類型4種,這4種簡單類型都是.NET中預定義的;而復合類型主要包括枚舉類型和結構類型,這兩種復合類型既可以是.NET中預定義的,也可以用戶自定義。本節主要對簡單類型進行詳細講解,簡單類型在實際中的應用如圖3.3所示。

圖3.3 簡單類型在實際中的應用

1. 整數類型

整數類型用來存儲整數數值,即沒有小數部分的數值。可以是正數,也可以是負數。整數數據在C#程序中有3種表示形式,分別為十進制、八進制和十六進制。

  •  十進制:十進制的表現形式大家都很熟悉,如120,0,–127。

注意

不能以0作為十進制數的開頭(0除外)。

  •  八進制:以0開頭的數,如0123(轉換成十進制數為83)、–0123(轉換成十進制數為–83)。

注意

八進制必須以0開頭。

  •  十六進制:以0x/0X開頭的數,如0x25(轉換成十進制數為37)、0Xb01e(轉換成十進制數為45086)。

注意

十六進制必須以0X或0x開頭。

C#中內置的整數類型如表3.1所示。

表3.1 C#內置的整數類型

說明

表3.1中出現了“有符號**”和“無符號**”,其中,“無符號**”是在“有符號**”類型的前面加了一個u,這里的u是unsigned的縮寫。它們的主要區別是:“有符號**”既可以存儲正數,也可以存儲負數;“無符號**”只能存放不帶符號的整數,因此,它只能存放正數。例如下面的代碼:

例如,定義一個int類型的變量i和一個byte類型的變量j,并分別賦值為2017和255,代碼如下:

此時,如果將byte類型的變量j賦值為256,即將代碼修改如下:

此時在Visual Studio開發環境中編譯程序,會出現如圖3.4所示的錯誤提示。

圖3.4 取值超出指定類型的范圍時出現的錯誤提示

分析圖3.4中出現的錯誤提示,主要是由于byte類型的變量是8位無符號整數,它的范圍在0 ~ 255,而256這個值已經超出了byte類型的范圍,所以編譯程序會出現錯誤提示。

說明

整數類型變量的默認值為0。

2. 浮點類型

浮點類型變量主要用于處理含有小數的數據,浮點類型主要包含float和double兩種類型。表3.2列出了這兩種浮點類型的描述信息。

表3.2 浮點類型及描述

如果不做任何設置,包含小數點的數值都被認為是double類型,例如9.27,沒有特別指定的情況下,這個數值是double類型。如果要將數值以float類型來處理,就應該通過強制使用f或F將其指定為float類型。

例如,下面的代碼就是將數值強制指定為float類型。

如果要將數值強制指定為double類型,則應該使用d或D進行設置,但加不加“d”或“D”沒有硬性規定,可以加也可以不加。

例如,下面的代碼就是將數值強制指定為double類型。

注意

(1)需要使用float類型變量時,必須在數值的后面跟隨f或F,否則編譯器會直接將其作為double類型處理;另外,也可以在double類型的值前面加上(float),對其進行強制轉換。

(2)浮點類型變量的默認值是0,而不是0.0。

3. decimal類型

decimal類型表示128位數據類型,它是一種精度更高的浮點類型,其精度可以達到28位,取值范圍為±1.0×10–28 ~ ±7.9×1028

技巧

由于decimal類型的高精度特性,它更合適于財務和貨幣計算。

如果希望一個小數被當成decimal類型使用,需要使用后綴m或M,例如:

如果小數沒有后綴m或M,數值將被視為double類型,從而導致編譯器錯誤,例如,在開發環境中運行下面代碼:

將會出現如圖3.5所示的錯誤提示。

從圖3.5可以看出,3.14這個數如果沒有后綴,直接被當成了double類型,所以賦值給decimal類型的變量時,就會出現錯誤提示。

圖3.5 不加后綴m/M時,decimal出現的錯誤

【例3.01】創建一個控制臺應用程序,聲明double型變量height來記錄身高,單位為米,聲明int型變量weight記錄體重,單位為千克,根據“BMI=體重/(身高*身高)”的公式計算BMI指數(身體質量指數),代碼如下:(實例位置:資源包\源碼\03\3.01)

程序運行效果如圖3.6所示。

圖3.6 根據身高體重計算BMI指數

4. bool類型

布爾類型主要用來表示true/false值,C#中定義布爾類型時,需要使用bool關鍵字。例如,下面代碼定義一個布爾類型的變量:

說明

布爾類型通常被用在流程控制語句中作為判斷條件。

這里需要注意的是,布爾類型變量的值只能是true或者false,不能將其他的值指定給布爾類型變量,例如,將一個整數10賦值給布爾類型變量,代碼如下:

在Visual Studio開發環境中運行這句代碼,會出現如圖3.7所示的錯誤提示。

圖3.7 將整數值賦值給布爾類型變量時出現的錯誤

說明

布爾類型變量的默認值為false。

5. 字符類型

字符類型在C#中使用Char類來表示,該類主要用來存儲單個字符,它占用16位(兩個字節)的內存空間。在定義字符型變量時,要以單引號(' ')表示,如'a'表示一個字符,而"a"則表示一個字符串,雖然其只有一個字符,但由于使用雙引號,所以它仍然表示字符串,而不是字符。字符類型變量的聲明非常簡單,代碼如下:

注意

Char類只能定義一個Unicode字符。Unicode字符是目前計算機中通用的字符編碼,它為針對不同語言中的每個字符設定了統一的二進制編碼,用于滿足跨語言、跨平臺的文本轉換和處理的要求,這里了解Unicode即可。

  •  Char類的使用

Char類為開發人員提供了許多的方法,可以通過這些方法靈活地對字符進行各種操作。Char類的常用方法及說明如表3.3所示。

表3.3 Char類的常用方法及說明

從表3.3可以看到,C#中的Char類提供了很多操作字符的方法,其中以Is和To開始的方法比較常用。以Is開始的方法大多是判斷Unicode字符是否為某個類別,例如,是否大小寫、是否是數字等;而以To開始的方法主要是對字符進行轉換大小寫及轉換字符串的操作。

【例3.02】創建一個控制臺應用程序,演示如何使用Char類提供的常見方法,代碼如下:

(實例位置:資源包\源碼\03\3.02)

程序的運行結果如圖3.8所示。

圖3.8 Char類常用方法的應用

  •  轉義字符

前面講到了字符只能存儲單個字符,但是,如果在Visual Studio開發環境中編寫如下代碼:

會出現如圖3.9所示的錯誤提示。

圖3.9 定義反斜線時的錯誤提示

從代碼表面上看,反斜線“\”是一個字符,正常應該是可以定義為字符的,但為什么會出現錯誤呢?這里就引出了轉義字符的概念。

轉義字符是一種特殊的字符變量,以反斜線“\”開頭,后跟一個或多個字符,也就是說,在C#中,反斜線“\”是一個轉義字符,不能單獨作為字符使用。因此,如果要在C#中使用反斜線,可以使用下面代碼表示:

轉義字符就相當于一個電源變換器,電源變換器就是通過一定的手段獲得所需的電源形式,例如交流變成直流、高電壓變為低電壓、低頻變為高頻等。轉義字符也是,它是將字符轉換成另一種操作形式,或是將無法一起使用的字符進行組合。

注意

轉義符\(單個反斜杠)只針對后面緊跟著的單個字符進行操作。

C#中的常用轉義字符如表3.4所示。

表3.4 轉義字符及其作用

【例3.03】創建一個控制臺應用程序,通過使用轉義字符在控制臺窗口中輸出Windows的系統目錄,代碼如下:(實例位置:資源包\源碼\03\3.03)

程序的運行結果如圖3.10所示。

圖3.10 輸出Windows的系統目錄

技巧

例3.03中輸出系統目錄時,遇到反斜杠時,使用“\\”表示,但是,如果遇到下面的情況:

從上面代碼看到,如果有多級目錄,遇到反斜杠時,如果都使用“\\”,會顯得非常麻煩,這時可以用一個@符號來進行多級轉義,代碼修改如下:

3.3.3 變量的初始化

變量的初始化實際上就是給變量賦值,以便在程序中使用。首先,在Visual Studio 2017開發環境中運行下面一段代碼:

運行上面代碼時,會出現如圖3.11所示的錯誤提示。

從圖3.11可以看出,如果直接定義一個變量進行使用,會提示使用了未賦值的變量,這說明:在程序中使用變量時,一定要對其進行賦值,也就是初始化,然后才可以使用。那么如何對變量進行初始化呢?

圖3.11 變量未賦值時的錯誤

初始化變量有3種方法,分別是單獨初始化變量、聲明時初始化變量、同時初始化多個變量,下面分別進行講解。

1. 單獨初始化變量

在C#中,使用賦值運算符“=”(等號)對變量進行初始化,即將等號右邊的值賦給左邊的變量。

例如,聲明一個變量sum,并初始化其默認值為2014,代碼如下:

說明

在對變量進行初始化時,等號右邊也可以是一個已經被賦值的變量。例如,首先聲明兩個變量sum和num,然后將變量sum賦值為2014,最后將變量sum賦值給變量num,代碼如下:

2. 聲明時初始化變量

聲明變量時可以同時對變量進行初始化,即在每個變量名后面加上給變量賦初始值的指令。

例如,聲明一個整型變量a,并且賦值為927。然后,再同時聲明3個字符串型變量并初始化,代碼如下:

3. 同時初始化多個變量

在對多個同類型的變量賦同一個值時,為了節省代碼的行數,可以同時對多個變量進行初始化。例如,聲明5個int類型的變量a,b,c,d,e,然后將這5個變量都初始化為0,代碼如下:

上面講解了初始化變量的3種方法,這時,我們對本節開始的代碼段進行修改,使其能夠正常運行,修改后的代碼如下:

再次運行程序,即可正常運行。

3.3.4 變量的作用域

由于變量被定義后,只是暫時存儲在內存中,等程序執行到某一個點后,該變量會被釋放掉,也就是說變量有它的生命周期。因此,變量的作用域是指程序代碼能夠訪問該變量的區域,如果超出該區域,則在編譯時會出現錯誤。在程序中,一般會根據變量的“有效范圍”將變量分為“成員變量”和“局部變量”。

1. 成員變量

在類體中定義的變量被稱為成員變量,成員變量在整個類中都有效。類的成員變量又可以分為兩種,即靜態變量和實例變量。

例如,在Test類中聲明靜態變量和實例變量,代碼如下:

其中,x為實例變量,y為靜態變量(也稱類變量)。如果在成員變量的類型前面加上關鍵字static,這樣的成員變量稱為靜態變量。靜態變量的有效范圍可以跨類,甚至可達到整個應用程序之內。對于靜態變量,除了能在定義它的類內存取,還能直接以“類名. 靜態變量”的方式在其他類內使用。

2. 局部變量

在類的方法體中定義的變量(定義方法的“{”與“}”之間的區域)稱為局部變量,局部變量只在當前代碼塊中有效。

在類的方法中聲明的變量,包括方法的參數,都屬于局部變量。局部變量只有在當前定義的方法內有效,不能用于類的其他方法中。局部變量的生命周期取決于方法,當方法被調用時,C#編譯器為方法中的局部變量分配內存空間,當該方法的調用結束后,則會釋放方法中局部變量占用的內存空間,局部變量也將會銷毀。

變量的有效范圍如圖3.12所示。

圖3.12 變量的有效范圍

【例3.04】創建一個控制臺應用程序,使用一個局部變量記錄用戶的登錄名,代碼如下:(實例位置:資源包\源碼\04\3.04)

程序運行結果如圖3.13所示。

圖3.13 使用一個局部變量記錄用戶的登錄名

3.4 常量

視頻講解

通過對前面知識的學習,我們知道了變量是隨時可以改變值的量,那么,在遇到不允許改變值的情況時,該怎么辦呢?這就是本節要講解的常量。

3.4.1 常量是什么

常量就是程序運行過程中,值不能改變的量,比如現實生活中的居民身份證號碼、數學運算中的π值等,這些都是不會發生改變的,它們都可以定義為常量。常量可以區分為不同的類型,比如98,368是整型常量,3.14,0.25是實數常量,即浮點類型的常量,m、r是字符常量。

3.4.2 常量的分類

常量主要有兩種,分別是const常量和readonly常量,下面分別對這兩種常量進行講解。

1. const常量

在C#中提到常量,通常指的是const常量。const常量也叫靜態常量,它在編譯時就已經確定了值。const常量的值必須在聲明時就進行初始化,而且之后不可以再進行更改。

例如,聲明一個正確的const常量,同時再聲明一個錯誤的const常量,以便讀者對比參考,代碼如下:

2. readonly常量

readonly常量是一種特殊的常量,也稱為動態常量,從字面理解上看,readonly常量可以進行動態賦值,但需要注意的是,這里的動態賦值是有條件的,它只能在構造函數中進行賦值,例如下面的代碼:

如果要在構造函數以外的位置修改readonly常量的值,比如,在Main方法中進行修改,代碼如下:

這時再運行程序,將會出現如圖3.14所示的錯誤提示。

圖3.14 試圖在構造函數以外的位置修改readonly常量值的錯誤提示

3. const常量與readonly常量的區別

const常量與readonly常量的主要區別如下:

  •  const常量必須在聲明時初始化,而readonly常量則可以延遲到構造函數中初始化。
  •  const常量在編譯時就被解析,即將常量的值替換成了初始化的值,而readonly常量的值需要在運行時確定。
  •  const常量可以定義在類中或者方法體中,而readonly常量只能定義在類中。

3.5 數據類型轉換

視頻講解

類型轉換是將一個值從一種數據類型更改為另一種數據類型的過程。例如,可以將string類型數據457轉換為一個int類型,而且可以將任意類型的數據轉換為string類型。

數據類型轉換有兩種方式,即隱式轉換與顯式轉換。如果從低精度數據類型向高精度數據類型轉換,則永遠不會溢出,并且總是成功的;而把高精度數據類型向低精度數據類型轉換,則必然會有信息丟失,甚至有可能失敗,這種轉換規則就像如圖3.15所示的兩個場景,高精度相當于一個大水杯,低精度相當于一個小水杯,大水杯可以輕松裝下小水杯中所有的水,但小水杯無法裝下大水杯中所有的水,裝不下的部分必然會溢出。

圖3.15 大小水杯轉換類比數據類型轉換的示意圖

3.5.1 隱式類型轉換

隱式類型轉換就是不需要聲明就能進行的轉換,進行隱式類型轉換時,編譯器不需要進行檢查就能自動進行轉換。下列基本數據類型會涉及數據轉換(不包括邏輯類型),這些類型按精度從“低”到“高”排列的順序為byte < short < int < long < float < double,可對照圖3.16,其中char類型比較特殊,它可以與部分int型數字兼容,且不會發生精度變化。

圖3.16 自動轉換的兼容順序圖

例如,將int類型的值隱式轉換成long類型,代碼如下:

3.5.2 顯式類型轉換

有很多場合不能隱式的進行類型轉換,否則編譯器會出現錯誤,例如,下面的類型在進行隱式轉換時會出現錯誤:

  •  int轉換為short—會丟失數據。
  •  int轉換為uint—會丟失數據。
  •  float轉換為int—會丟失小數點后面的所有數據。
  •  double轉換為int—會丟失小數點后面的所有數據。
  •  數值類型轉換為char—會丟失數據。
  •  decimal轉換為其他數值類型—decimal類型的內部結構不同于整數和浮點數。

如果遇到上面類型之間的轉換,就需要用到C#中的顯式類型轉換。顯式類型轉換也稱為強制類型轉換,它需要在代碼中明確地聲明要轉換的類型。如果要把高精度的變量轉換為低精度的變量,就需要使用顯式類型轉換。

顯式類型轉換的一般形式為:

其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。

例如,下面的代碼用來把x轉換為float類型:

通過顯式類型轉換,就可以解決高精度數據向低精度轉換的問題,例如,將double類型的值4.5賦值給int類型變量時,可以使用下面的代碼實現:

3.5.3 使用Convert類進行轉換

3.5.2節中講解了使用“(類型說明符)表達式”可以進行顯式類型轉換,下面使用這種方式實現下面的類型轉換:

按照代碼的本意,i的值應該是3000000000,但在運行上面兩行代碼時,卻發現i的值是–1294967296,這主要是由于int類型的最大值為2147483647,很明顯,3000000000要比2147483647大,所以在使用上面代碼進行顯式類型轉換時,出現了與預期不符的結果,但是程序并沒有報告錯誤,如果在實際開發中遇到這種情況,可能會引起大的BUG,那么,在遇到這種類型的錯誤時,有沒有一種方式能夠向開發人員報告錯誤呢?答案是肯定的。C#中提供了Convert類,該類也可以進行顯式類型轉換,它的主要作用是將一個基本數據類型轉換為另一個基本數據類型。Convert類的常用方法及說明如表3.5所示。

表3.5 Convert類的常用方法及說明

例如,定義一個double類型的變量x,并賦值為198.99,使用Convert類將其顯式轉換為int類型,代碼如下:

下面使用Convert類的ToInt32對本節開始的兩行代碼進行修改,修改后的代碼如下:

再次運行這兩行代碼,則會出現如圖3.17所示的錯誤提示。

圖3.17 顯式類型轉換的錯誤提示

這樣,開發人員即可根據圖3.17中的錯誤提示對程序代碼進行修改,避免程序出現邏輯錯誤。

3.6 小結

本章向讀者介紹的是C#的基礎語法,其中需要讀者重點掌握的是C#中的基本數據類型、變量與常量以及數據類型的轉換等內容。在使用變量時,需要讀者注意的是變量的有效范圍,否則在使用時會出現編譯錯誤或浪費內存資源。

3.7 實戰

3.7.1 實戰一:打印保險單詳細列表

打印保險單詳細列表時,使用Char類型記錄用戶的性別是M(男)還是W(女),效果如圖3.18所示。(實例位置:資源包\源碼\03\實戰\01)

圖3.18 使用字符記錄用戶性別

3.7.2 實戰二:記錄京東618節日名稱

使用一個int類型的變量記錄每年京東的年中促銷活動節日名稱(提示:618),運行效果如圖3.19所示。(實例位置:資源包\源碼\03\實戰\02)

圖3.19 使用變量記錄京東618節日名稱

主站蜘蛛池模板: 保亭| 拉萨市| 昌乐县| 鹰潭市| 姚安县| 金平| 扬州市| 双牌县| 神农架林区| 鄂伦春自治旗| 吴旗县| 金山区| 仙桃市| 兴化市| 股票| 英吉沙县| 巴林左旗| 平顺县| 长白| 织金县| 望都县| 永登县| 南雄市| 连城县| 五家渠市| 邵阳县| 邹城市| 阿荣旗| 乐都县| 青岛市| 苗栗县| 富顺县| 清徐县| 来宾市| 响水县| 乌兰察布市| 峨眉山市| 新田县| 日土县| 龙山县| 韩城市|