C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一
一、數(shù)據(jù)類型與變量的介紹
在程序運(yùn)行的過(guò)程中計(jì)算機(jī)需要記錄大量的狀態(tài) 數(shù)據(jù)(這里我們統(tǒng)稱數(shù)據(jù))。那這些數(shù)據(jù)都存放在哪呢?程序在運(yùn)行過(guò)程中的數(shù)據(jù)一般都存放在內(nèi)存。那么他們?cè)趦?nèi)存中如何存放的一種描述就是數(shù)據(jù)類型。變量則就是數(shù)據(jù)類型的實(shí)體。那么我們來(lái)看一個(gè)例子: 假如現(xiàn)在需要設(shè)計(jì)一個(gè)程序計(jì)算整數(shù) 10 與 20 的和, 請(qǐng)看如下代碼:
using System; namespace MyProgram { class Program { static void Main(string[] args) { //變量的定義格式: //數(shù)據(jù)類型 變量名 賦值運(yùn)算符 值 int a = 10; // 定義一個(gè)整數(shù)類型的變量a 并賦值10 int b = 20; // 定義一個(gè)整數(shù)類型的變量b 并賦值20 int c = a + b;//定義一個(gè)整數(shù)類型的變量b 賦值為 a + b 的和 Console.WriteLine("10 + 20 = "+c.ToString());//打印結(jié)果 } } }
分析: 首先要計(jì)算整數(shù)10與20的和,肯定需要有地方來(lái)放(在內(nèi)存中存儲(chǔ))它們,既然計(jì)算整數(shù)那么我們就用整數(shù)的數(shù)據(jù)類 型int 定義名字為a 和 b的變量來(lái)分別存放10 和 20,在通過(guò)加法運(yùn)算符將和存放在變量c中。調(diào)用我們之前了解過(guò)的控制臺(tái)類將結(jié)果輸出到控制臺(tái)顯示出來(lái),這里要注意c.ToString(), 因?yàn)槲覀冇?jì)算的是整數(shù),所使用變量的類型都是整數(shù),而控制臺(tái)輸出的是字符串,所以我們需要將調(diào)用int類型的一個(gè)行為ToString()將自己轉(zhuǎn)換為字符串類型!這部分將在數(shù)據(jù)類型的第三篇中介紹!
二、C#基本數(shù)據(jù)類型與變量
1.數(shù)據(jù)類型
C#的數(shù)據(jù)類型分為兩類:一種是值類型 一種是引用類型 (值類型與引用類型將在數(shù)據(jù)類型的第二篇中介紹),那么我們來(lái)看看C#的常用數(shù)據(jù)類型。
2.匿名類型
了解C#常用的基礎(chǔ)數(shù)據(jù)類型以后,我們?cè)趤?lái)看看匿名類型,什么是匿名類型呢?
匿名類型:匿名類型就是在變量初始化后根據(jù)所賦的值來(lái)判斷它屬于哪個(gè)類型。不明白沒(méi)關(guān)系,舉個(gè)例子:
using System; namespace MyProgram { class Program { static void Main(string[] args) { int a = 20; //定義一個(gè)整數(shù)類型的變量 char b = 'A';//定義一個(gè)字符類型的變量 var _intType = 20; //定義一個(gè)匿名類型的變量 給賦值一個(gè)整數(shù)數(shù)字 20 var _charType = 'A'; //定義一個(gè)匿名類型的變量 給賦值一個(gè)字符 A Console.WriteLine(" a 的數(shù)據(jù)類型為:{0}",a.GetType().ToString()); //打印出變量a的數(shù)據(jù)類型 Console.WriteLine(" b 的數(shù)據(jù)類型為:{0}", b.GetType().ToString()); //打印出變量b的數(shù)據(jù)類型 Console.WriteLine(" _intType 的數(shù)據(jù)類型為:{0}", _intType.GetType().ToString());//打印出變量_intType的數(shù)據(jù)類型 Console.WriteLine(" _charType 的數(shù)據(jù)類型為:{0}", _charType.GetType().ToString());//打印出變量_charType的數(shù)據(jù)類型 } } }
首先看 9 ~ 10行,定義了一個(gè)整數(shù)類型的變量a賦值為20和一個(gè)字符類型的變量b為賦值為A,那么 a與b的數(shù)據(jù)類型分別為整數(shù)類型(System.Int32與System.Char).
接著看 12 ~ 13行,定義了兩個(gè)匿名類型的變量為: _intType,_charType,分別給 _intType賦了一個(gè)整數(shù)的值為20,給_charType賦了一個(gè)字符為A。在程序運(yùn)行之前編譯器會(huì)根絕變量所賦的值來(lái)自動(dòng)判斷數(shù)據(jù)類型。
程序執(zhí)行結(jié)果如下:
提示:匿名類型變量在編譯后確定數(shù)據(jù)類型之后,在程序作用域內(nèi)該變量的數(shù)據(jù)類型不可改變!
3.變量與變量的作用域
變量:經(jīng)過(guò)上面的例子與介紹應(yīng)該已經(jīng)對(duì)變量不陌生了,變量就是數(shù)據(jù)類型的實(shí)例。真正用來(lái)存放數(shù)據(jù)的內(nèi)存空間或存放數(shù)據(jù)內(nèi)存空間地址。
作用域:作用域就是程序使用該變量的一個(gè)范圍。一般變量作用域的邊界是由符號(hào){與}來(lái)劃定界限的,也就是說(shuō)在{}內(nèi)定義的變量,就只能在{}內(nèi)部來(lái)調(diào)用。
C#的作用域可分為兩種級(jí)別:
1.類屬性級(jí)別:當(dāng)變量定義為類的屬性是,變量的作用域?yàn)檎麄€(gè)類的內(nèi)部可訪問(wèn)。
2.局部級(jí)別:當(dāng)變量被定義在方法或者語(yǔ)句塊中,變量的作用域?yàn)樽罱膡}之間可訪問(wèn),局部級(jí)別的變量必須初始化。
關(guān)于作用域的問(wèn)題:
1.當(dāng)一個(gè)類定義的變量(屬性)與該類方法中定義的局部變量重名時(shí)會(huì)怎么樣?
答:當(dāng)前作用域中的變量與上級(jí)作用域中的變量重名時(shí),以當(dāng)前作用域中的變量為準(zhǔn)。
2.當(dāng)一個(gè)類定義的變量(屬性)重名或者類方法中定義的局部變量重名時(shí)會(huì)怎么樣?
答:同一個(gè)作用于中不能出現(xiàn)相同名稱的變量
參考代碼:
class MyClass { int a = 10; public void MyMethod() { int a = 20; //方法內(nèi)部變量與類屬性變量 a同時(shí)出現(xiàn)時(shí), 以當(dāng)前方法內(nèi)(作用域的變量為準(zhǔn)) Console.WriteLine("a:{0}",a); //輸出結(jié)果為20 int a = 30; // 編譯錯(cuò)誤,同一個(gè)作用域內(nèi)不可以出現(xiàn)相同名稱的變量 } }
三、數(shù)據(jù)類型默認(rèn)值與初始化
C#中類定義屬性可以不用初始化,那么他們的值分別是什么呢? 未賦值的變量會(huì)被自動(dòng)賦予一個(gè)合適的默認(rèn)值。
例如:
int 類型(數(shù)值類型)默認(rèn)值為0
bool 類型 默認(rèn)值為false
char 類型 默認(rèn)值為 ‘\0'
我們還可以在定義類屬性是就初始化他們的值,也可以通過(guò)類的構(gòu)造函數(shù)來(lái)初始化類屬性
class MyClass { public int a = 10; //第一種初始化方法在定義是就賦值 public bool b; //默認(rèn)值為false public MyClass(bool c) { b = c; //通過(guò)構(gòu)造函數(shù)初始化類屬性 } } class Program { static void Main(string[] args) { MyClass mc = new MyClass(true);//通過(guò)構(gòu)造函數(shù)傳入true 賦給參數(shù)bool類型變量c = true Console.WriteLine("mc->a :{0}", mc.a.ToString()); Console.WriteLine("mc->b :{0}",mc.b.ToString()); } }
輸出結(jié)果如下:
四、靜態(tài)變量
靜態(tài)變量就是通過(guò)類級(jí)別去調(diào)用,無(wú)需創(chuàng)建類型的對(duì)象就可以用的變量。
靜態(tài)變量關(guān)鍵字: static
定義格式: [static 數(shù)據(jù)類型 變量名]
實(shí)例代碼:
using System; namespace MyProgram { class MyClass { public int a = 10; //變量a為對(duì)象級(jí)別屬性 public static int b = 20; //變量b為類級(jí)別屬性 } class Program { static void Main(string[] args) { MyClass mc = new MyClass(); int a_Mc = mc.a; //變量級(jí)別需要?jiǎng)?chuàng)建對(duì)象MC后通過(guò)MC(對(duì)象)來(lái)訪問(wèn) int b_MyClass = MyClass.b; //類屬性可直接通過(guò)類名訪問(wèn)無(wú)需創(chuàng)建對(duì)象 Console.WriteLine("mc->a :{0}", a_Mc); Console.WriteLine("MyClass->b :{0}", b_MyClass); } } }
運(yùn)行結(jié)果如下:
五、常量
常量就是不能被改變的變量,常量只能定義在類屬性級(jí)別,常量也必須是靜態(tài)的,并且在定義時(shí)就初始化賦值,常量一旦被初始化后就不可以在改變,任何對(duì)常量改變語(yǔ)句都將引起編譯器錯(cuò)誤。因?yàn)槌A慷x時(shí)就要賦值所以常量類型只能聲明給值類型(值類型與引用類型下篇講解)。
常量的定義格式: [const 數(shù)據(jù)類型 變量名]
代碼:
using System; namespace MyProgram { class MyClass { public const int a = 10; //定義常量a public const bool b = false; //定義常量b } class Program { static void Main(string[] args) { int a_Const_MyClass = MyClass.a; //常量必須是靜態(tài)的,通過(guò)類名訪問(wèn) bool b_Const_MyClass = MyClass.b; //常量必須是靜態(tài)的,通過(guò)類名訪問(wèn) Console.WriteLine("MyClass->a_Const :{0}", a_Const_MyClass.ToString()); Console.WriteLine("MyClass->b_Const :{0}", b_Const_MyClass.ToString()); //任何試圖修改常量的動(dòng)作都會(huì)引起編譯錯(cuò)誤 MyClass.a = 20; MyClass.b = true; } } }
正確操作運(yùn)行結(jié)果如下:
修改常量提示錯(cuò)誤如下:
六、只讀與靜態(tài)只讀
回顧下常量在聲明時(shí)必須初始化賦值,那么如果我想在運(yùn)行的時(shí)候才賦值怎么辦?那么不用怕C#為我們提供了只讀類型關(guān)鍵字為:readonly ,只讀類型跟常量類似也是賦值后就不可以改變,但與常量不同的是它不是強(qiáng)制靜態(tài)的,也就是只讀類型是對(duì)象級(jí)別來(lái)訪問(wèn)的。
只讀類型定義方式:[readonly 數(shù)據(jù)類型 變量名]
那么如何讓他成為靜態(tài)的? 很簡(jiǎn)單在前面我們已經(jīng)介紹過(guò)靜態(tài)的關(guān)鍵字static
靜態(tài)只讀類型定義方式:[static readonly 數(shù)據(jù)類型 變量名]
代碼:
using System; namespace MyProgram { class MyClass { public readonly int a = 10; //定義只讀變量a public static readonly bool b = false; //定義靜態(tài)只讀變量b } class Program { static void Main(string[] args) { MyClass mc = new MyClass(); int a_ReadOnly_MC = mc.a; //只讀變量是非靜態(tài)的,由對(duì)象級(jí)別訪問(wèn) bool b_StaticReadOnly_MyClass = MyClass.b; //靜態(tài)只讀變量是類級(jí)別變量,有類名訪問(wèn) Console.WriteLine("a_ReadOnly_MC : {0}",a_ReadOnly_MC); Console.WriteLine("b_StaticReadOnly_MyClass :{1}", b_StaticReadOnly_MyClass); //任何對(duì)只讀類型的修改都將引起編譯錯(cuò)誤 mc.a = 20; MyClass.b = true; } } }
正確操作運(yùn)行結(jié)果如下:
修改只讀變量錯(cuò)誤如下:
七、需要注意的細(xì)節(jié)
1.變量作用域是否可以出現(xiàn)相同變量名?
答:相同作用域時(shí),變量不可以重名,在當(dāng)前作用域與上級(jí)作用域的變量重名時(shí),以變量所在作用域?yàn)橹鳌?br />
2.常量是否可以在對(duì)象級(jí)別訪問(wèn)?
答:常量不可以在對(duì)象級(jí)別訪問(wèn),常量默認(rèn)為靜態(tài)的,由類級(jí)別訪問(wèn)。
3.常量(const)與(readonly)只讀的區(qū)別?
答:相同點(diǎn):是都是賦值后就不可以改變,
不同點(diǎn):
1.Const 必須在聲明時(shí)就賦值,readonly 可以在初始化過(guò)程中賦值.
2.Const只可以修飾值類型,而readonly可以修飾任意類型.
3.Const是類級(jí)別訪問(wèn),readonly是對(duì)象級(jí)別訪問(wèn)
以上講解的類的屬性都代表成員變量,希望對(duì)大家的學(xué)習(xí)有所幫助。之后還有相關(guān)文章繼續(xù)更新,希望大家繼續(xù)關(guān)注。
- C# 對(duì)文件與文件夾的操作包括刪除、移動(dòng)與復(fù)制
- C# Bitmap 復(fù)制的小例子
- c#根據(jù)文件大小顯示文件復(fù)制進(jìn)度條實(shí)例
- C#使用SqlBulkCopy批量復(fù)制數(shù)據(jù)到數(shù)據(jù)表
- ASP.NET深度復(fù)制和淺度復(fù)制分析
- C#進(jìn)行文件讀寫、創(chuàng)建、復(fù)制、移動(dòng)、刪除的方法
- C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- C#裝箱和拆箱原理詳解
- C#編程自學(xué)之運(yùn)算符和表達(dá)式
- C#中深度復(fù)制和淺度復(fù)制詳解
相關(guān)文章
C#利用Task實(shí)現(xiàn)任務(wù)超時(shí)多任務(wù)一起執(zhí)行的方法
這篇文章主要給大家介紹了關(guān)于C#利用Task實(shí)現(xiàn)任務(wù)超時(shí),多任務(wù)一起執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)一起看看吧。2017-12-12vista和win7在windows服務(wù)中交互桌面權(quán)限問(wèn)題解決方法:穿透Session 0 隔離
服務(wù)(Service)對(duì)于大家來(lái)說(shuō)一定不會(huì)陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開(kāi)啟~關(guān)閉”而“開(kāi)始~停止”其工作內(nèi)容,在這期間無(wú)需任何用戶參與2016-04-04C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了如何利用C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12C#中winform中panel重疊無(wú)法顯示問(wèn)題的解決
這篇文章主要介紹了C#中winform中panel重疊無(wú)法顯示問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10