《C#高级编程》 读书心得1--核心C# 几点你可能没注意,但很基础的小东西。
這是本系列讀書(shū)心得第一篇。
其實(shí)所謂核心C#也就是C#的語(yǔ)法基礎(chǔ),相信大家應(yīng)該已經(jīng)非常熟悉了,在這里說(shuō)一下在書(shū)中看到,大家可能平時(shí)沒(méi)有太注意到的。此篇比較基礎(chǔ),也是第一次寫(xiě)讀書(shū)心得,請(qǐng)勿噴啊。
變量以及其作用域。
? ? ?首先聲明變量:可以直接用int i; 其實(shí)它是聲明一個(gè)名為i 的System.Int32的一個(gè)實(shí)例。 像int, long這樣的關(guān)鍵字都是指向.NET預(yù)定義類型,也就是說(shuō)用他們聲明的變量是他們所指向的.NET預(yù)定義類型的一個(gè)實(shí)例。在.net中一共有15個(gè)這樣的預(yù)定義類型,13個(gè)值類型,2個(gè)引用類型(object和string)。如int 對(duì)應(yīng)的System.Int32, long對(duì)應(yīng)System.Int64。 就像大學(xué)的時(shí)候我們C語(yǔ)言的老師一直都說(shuō)int變量的值范圍為-32768~32767,是因?yàn)楫?dāng)時(shí)的C語(yǔ)言編譯環(huán)境為16位。 還要強(qiáng)調(diào)一點(diǎn)就是string字符串在C#中為引用類型,也就是說(shuō)一個(gè)string變量是存儲(chǔ)在托管堆上的,而像int這樣的值類型是存儲(chǔ)在堆棧上。
? ? 我們?cè)趇nt上按F12跳轉(zhuǎn)到定義就會(huì)看到它其實(shí)是一個(gè)結(jié)構(gòu)體:public struct Int32, 所一它存儲(chǔ)在堆棧上,而string的定義是public sealed class String是一個(gè)類。
? ? 在定義一個(gè)string a后,并沒(méi)有為其初始化a的值為null,而int a后a默認(rèn)為0。 再有string a="123" 聲明了一個(gè)string類型,然后對(duì)其再次賦值a="456",會(huì)再次創(chuàng)建一個(gè)值為456的實(shí)例,而不是修改值為123的實(shí)例。int a=9之后int b=a 這樣在內(nèi)存中會(huì)生成兩個(gè)值為9的int結(jié)構(gòu)體實(shí)例在堆棧中。還有bool變量只接受true或者false,而不會(huì)接受0或者1不會(huì)對(duì)其隱式類型轉(zhuǎn)換。bool變量的默認(rèn)值為false。
? ? 關(guān)于int對(duì)應(yīng)System.Int32,bool對(duì)應(yīng)System.Boolean等其實(shí)都是結(jié)構(gòu),他們都是繼承于System.ValueType, 而System.VauleType又繼承與System.Object. 所以他們的實(shí)例都可以進(jìn)行ToString()這樣的操作。String就直接繼承與System.object。
? ? 關(guān)于變量的作用域有這樣一個(gè)有趣的事,請(qǐng)看下面兩段代碼
1 class Program1 2 { 3 private static void Main(string[] args) 4 { 5 int j = 20; 6 for (int i = 0; i < 10; i++) 7 { 8 int j = 30; 9 Console.WriteLine(j + 1); 10 } 11 } 12 } 1 class Program2 2 { 3 private static int j = 20; 4 static void Main(string[] args) 5 { 6 int j = 30; 7 Console.WriteLine(j); 8 return; 9 } 10 }?
? ? ? ? 第一段代碼運(yùn)行后會(huì)報(bào)錯(cuò),變量j重復(fù)定義。
? ? ? ? 而對(duì)于第二段,有人也會(huì)認(rèn)為他會(huì)報(bào)錯(cuò),但運(yùn)行后會(huì)輸出變量j 為30。 這是因?yàn)樽兞柯暶髟陬愔?#xff0c;C#就認(rèn)為它為類的字段,Main方法中的j為局部變量。在main方法中聲明j局部變量后類中的字段j被隱藏,所以編譯成功,如果要類級(jí)別上的j可以用Program2.j。但為了代碼的可讀性我們?cè)诖a中避免這樣的寫(xiě)法。
?
關(guān)于常量 const 和readonly的區(qū)別。
? ? ? ? 先說(shuō)常量,常量必須在聲明時(shí)初始化,之后不可修改,常量的值必須在編譯時(shí)就可以計(jì)算出來(lái),不可以用一個(gè)變量中提取出的值來(lái)初始化常量。常量是靜態(tài)的,但要是加上static關(guān)鍵字會(huì)報(bào)錯(cuò)。
? ? ? ? 而只讀字段readonly,它要比const常量要靈活,他一般在生成實(shí)例,在構(gòu)造函數(shù)中初始化,實(shí)例生成后其值也就不可變化了,所以自讀字段的值只要在生成實(shí)例之前能夠計(jì)算出來(lái)就是可以的。
?預(yù)處理指令
? ? ? ? 書(shū)中列舉了很多預(yù)處理指令,有很多之前都沒(méi)有用過(guò),但相信應(yīng)該都有用過(guò)#region ?#endregion 去折疊一段代碼。這里要說(shuō)明一下#if DEBUG #else #endif(請(qǐng)注意,在C#預(yù)指令里是也是區(qū)分大小寫(xiě)的)。請(qǐng)看下段代碼。
1 static void Main(string[] args) 2 { 3 Console.WriteLine("Always write"); 4 5 #if DEBUG 6 Console.WriteLine("Write When Debug"); 7 #else 8 Console.WriteLine("Write When Release"); 9 #endif 10 11 Console.ReadLine(); 12 13 return; 14 15 16 }?
運(yùn)行的話會(huì)看到效果,當(dāng)選擇DEBUG 模式進(jìn)行調(diào)試的話,DEBUG就會(huì)為真,當(dāng)選擇Release的話,DEBUG就會(huì)為假。當(dāng)然可能有的版本VS會(huì)要進(jìn)行一下設(shè)置,右鍵點(diǎn)擊項(xiàng)目,選擇屬性,“生成”選顯卡里,選定“定義DEBUG常量”。這樣DEBUG常量才會(huì)生效。此方法在調(diào)試一些登陸后后才可見(jiàn)的功能比較有用,調(diào)試的時(shí)候誰(shuí)也不想每次登錄這么麻煩吧。
?
本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 2.5 中國(guó)大陸許可協(xié)議進(jìn)行許可。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/heylon/archive/2012/10/27/2742175.html
總結(jié)
以上是生活随笔為你收集整理的《C#高级编程》 读书心得1--核心C# 几点你可能没注意,但很基础的小东西。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用C++写的 Levenshtein 算
- 下一篇: 实现单链表的倒置