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

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

圖3.3 簡單類型在實際中的應用
1.整數類型
整數類型用來存儲整數數值,即沒有小數部分的數值。可以是正數,也可以是負數。整數類型數據在C# 程序中有3 種表現形式,分別為十進制、八進制和十六進制。
(1)十進制:十進制的表現形式比較常見,如120、0、-127。
學習筆記
不能以0 作為十進制數的開頭。
(2)八進制:以0 開頭的數,如0123(轉換成十進制數為83)、-0123(轉換成十進制數為-83)。
學習筆記
八進制數必須以0 開頭。
(3)十六進制:以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 類型。

學習筆記
當需要使用float 類型變量時,必須在數值的后面跟隨f 或F,否則編譯器會直接將其作為double 類型處理。另外,可以在double 類型的值前面加上 “(float)” 對其進行強制轉換。浮點類型變量的默認值是0,而不是0.0。
3.decimal 類型
decimal 類型表示128 位數據類型,它是一種精度更高的浮點類型,其精度可以達到28 位,取值范圍為-7.9×1028 ~7.9×1028。
學習筆記
由于decimal 類型的高精度特性,它更適用于財務和貨幣計算。
如果希望一個小數被當成decimal 類型使用,則需要使用后綴m 或M,如下所示。

如果小數沒有后綴m 或M,則數值將被視為double 類型,從而導致編譯器錯誤。例如,在開發環境中運行下面的代碼,將會出現如圖3.5 所示的錯誤提示信息。


圖3.5 不加后綴m 或M 時編譯器出現的錯誤提示信息
由圖3.5 可以看出,“3.14” 這個數值如果沒有后綴,就會直接被當成double 類型,所以在賦值為decimal 類型的變量時就會出現錯誤提示信息。
示例1.根據身高和體重計算BMI 指數
創建一個控制臺應用程序,聲明double 類型變量height 來記錄身高,單位為米;聲明int 類型變量weight 來記錄體重,單位為千克。根據 “BMI = 體重÷( 身高× 身高)” 計算BMI 指數(身體質量指數),代碼如下。

學習筆記
第10、14、18 和22 行代碼使用了if…else if 條件判斷語句,該語句主要用來判斷是否滿足某種條件,我們將在第4章對其進行詳細講解,這里只需要了解即可。
根據身高和體重計算BMI 指數代碼的運行結果如圖3.6 所示。

圖3.6 根據身高和體重計算BMI 指數代碼的運行結果
4.布爾類型
布爾類型主要用來表示true 值或false 值,在C# 中定義布爾類型時,需要使用布爾關鍵字。例如,下面代碼定義一個布爾類型變量。

學習筆記
布爾類型通常被用在流程控制語句中作為判斷條件。
這里需要注意的是,布爾類型變量的值只能是true 或false,不能將其他的值指定給布爾類型變量。例如,將一個整數10 賦值給布爾類型變量,代碼如下。

在Visual Studio 中運行這行代碼,會出現如圖3.7 所示的錯誤提示信息。

圖3.7 將整數賦值給布爾類型變量時出現的錯誤提示信息
學習筆記
布爾類型變量的默認值為false。
5.字符類型
字符類型在C# 中使用Char 類來表示,該類主要用來存儲單個字符,它占用16 位(2字節)的內存空間。在定義字符類型變量時,要以單引號(' ')表示,如'a' 表示一個字符,而"a" 則表示一個字符串。雖然其只有一個字符,但由于使用雙引號,所以它仍然表示字符串,而不是字符。字符類型變量的聲明非常簡單,代碼如下。

學習筆記
Char 類只能定義一個Unicode 字符。Unicode 字符是目前計算機中通用的字符編碼,它為針對不同語言中的每個字符設定了統一的二進制編碼,用于滿足跨語言、跨平臺的文本轉換和處理要求,這里了解Unicode 即可。
1)Char 類的使用
Char 類為開發人員提供了許多方法,可以通過使用這些方法靈活地對字符進行各種操作。Char 類的常用方法及說明如表3.3 所示。
表3.3 Char 類的常用方法及說明

從表3.3 中可以看到,C# 中的Char 類提供了很多操作字符的方法,其中,以“Is”和“To” 開始的方法比較常用。以 “Is” 開始的方法大多是判斷Unicode 字符是否為某個類別,如是否為大/ 小寫、是否是數字等;而以 “To” 開始的方法主要用來對字符進行大小寫轉換及字符串轉換的操作。
示例2.Char 類的常用方法的應用
創建一個控制臺應用程序,演示如何使用Char 類提供的常用方法,代碼如下。


學習筆記
第3 ~8 行代碼聲明了5 個不同類型的字符變量,下面的操作都是圍繞這5 個字符變量進行的。
第25 行代碼主要是為了使控制臺界面能夠停留在桌面上。
運行上面代碼,得到如圖3.8 所示的內容。

圖3.8 Char 類的常用方法的應用
2)轉義字符
前面講到了字符類型只能存儲單個字符,但是,如果在Visual Studio 中編寫如下代碼,則會出現如圖3.9 所示的錯誤提示信息。

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

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

轉義字符相當于一個電源變換器。電源變換器通過一定的手段獲得所需要的電源形式,如交流變成直流、高電壓變為低電壓、低頻變為高頻等。轉義字符的功能與其類似,它可以將字符轉換成另一種操作形式,或者將無法一起使用的字符進行組合。
學習筆記
轉義字符 “\” 只針對后面緊跟著的單個字符進行操作。
C# 中的常用轉義字符及其作用如表3.4 所示。
表3.4 C# 中的常用轉義字符及其作用

示例3.輸出Windows 的系統目錄
創建一個控制臺應用程序,通過使用轉義字符在控制臺窗口中輸出Windows 的系統目錄,代碼如下。


輸出Windows 的系統目錄代碼的運行結果如圖3.10 所示。

圖3.10 輸出Windows 的系統目錄代碼的運行結果
學習筆記
在輸出系統目錄時,如果遇到反斜杠,則使用 “\\” 表示。但是,如果有多級目錄,在遇到反斜杠時,如果都使用 “\\”,則會顯得非常麻煩。如果遇到下面這種情況:

3.3.3 變量的初始化

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

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

圖3.11 變量未賦值時出現的錯誤提示信息
從圖3.11 中可以看出,如果在使用變量時直接定義一個變量,則會提示使用了未賦值的變量,這說明在程序中使用變量時一定要對其進行賦值,也就是初始化,然后才可以使用。那么如何對變量進行初始化呢?
初始化變量有3 種方法,分別是單獨初始化變量、聲明時初始化變量、同時初始化多個變量,下面分別進行講解。
1.單獨初始化變量
在C# 中,使用賦值運算符 “=”(等號)對變量進行初始化,即將等號右邊的值賦給左邊的變量。
例如,聲明一個變量sum 并初始化,其默認值為2017,代碼如下。

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

2.在聲明時初始化變量
在聲明變量時可以對變量進行初始化,即在每個變量名后面加上給變量賦初始值的指令。
例如,先聲明一個整型變量mr 并賦值為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 變量的有效范圍
示例4.使用變量記錄用戶的登錄名
創建一個控制臺應用程序,使用一個局部變量記錄用戶的登錄名,代碼如下。

使用變量記錄用戶的登錄名代碼的運行結果如圖3.13 所示。

圖3.13 使用變量記錄用戶的登錄名代碼的運行結果
- C# 2012程序設計實踐教程 (清華電腦學堂)
- 造個小程序:與微信一起干件正經事兒
- The React Workshop
- Git高手之路
- Python高級機器學習
- SAP BusinessObjects Dashboards 4.1 Cookbook
- ANSYS Fluent 二次開發指南
- OpenCV with Python Blueprints
- ABAQUS6.14中文版有限元分析與實例詳解
- Developing Java Applications with Spring and Spring Boot
- Jakarta EE Cookbook
- CryENGINE Game Programming with C++,C#,and Lua
- RESTful Web API Design with Node.js
- 基于JavaScript的WebGIS開發
- jQuery Essentials