第二章
1.標(biāo)識(shí)符
標(biāo)識(shí)符是一種字符串,且區(qū)分大小寫(xiě)
特點(diǎn):
1.字母和下劃線可以用在任何位置(a-z、A-Z、_)?!鞠聞澗€可以開(kāi)頭】
2.數(shù)字不可以放在首位,可以放在其他任何位置。
3.@只允許放在標(biāo)識(shí)符的首位,雖然允許使用但是不推薦常用。
延伸:[@在C#中的用法:
1.忽略轉(zhuǎn)義字符
例如
string fileName = "D:\\文本文件\\text.txt";
使用@后
string fileName = @"D:\文本文件\text.txt";
2.讓字符串跨行
例如
string strSQL = "SELECT * FROM HumanResources.Employee AS e"
+ " INNER JOIN Person.Contact AS c"
+ " ON e.ContactID = c.ContactID"
+ " ORDER BY c.LastName";
使用@后
string strSQL = @"SELECT * FROM HumanResources.Employee AS e
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
ORDER BY c.LastName";
3.在標(biāo)識(shí)符中的用法
C#是不允許關(guān)鍵字作為標(biāo)識(shí)符(類(lèi)名、變量名、方法名、表空間名等)使用的,但如果加上@之后就可以了
例如
public static void @static(int @int)
{
if (@int > 0)
{
System.Console.WriteLine("Positive Integer");
}
else if (@int == 0)
{
System.Console.WriteLine("Zero");
}
else
{
System.Console.WriteLine("Negative Integer");
}
}
2.關(guān)鍵字
關(guān)鍵字是對(duì)編譯器具有特殊意義的預(yù)定義保留標(biāo)識(shí)符。它們不能在程序中用作標(biāo)識(shí)符,除非它們有一個(gè) @ 前綴。例如,@if 是有效的標(biāo)識(shí)符,但 if 不是,因?yàn)?if 是關(guān)鍵字。
具體用法與釋義
https://www.cnblogs.com/LS520/p/7115435.html
https://msdn.microsoft.com/zh-cn/library/x53a06bb(VS.80).aspx
3.代碼的注釋
第三章:類(lèi)型、存儲(chǔ)和變量
1.預(yù)定義類(lèi)型
1.三種非簡(jiǎn)單類(lèi)型:
string:是一個(gè)Unicode字符數(shù)組
object:是所有其他類(lèi)型的基類(lèi)
dynamic:使用動(dòng)態(tài)語(yǔ)言編寫(xiě)的程序集時(shí)使用
2.簡(jiǎn)單類(lèi)型-11種數(shù)值類(lèi)型
3.簡(jiǎn)單類(lèi)型-非數(shù)值類(lèi)型:char bool
2.dynamic與var的區(qū)別
var 在編譯階段已經(jīng)確定類(lèi)型,在初始化時(shí)候,必須提供初始化的值,而dynamic則可以不提供,它是在運(yùn)行時(shí)才確定類(lèi)型
1.var聲明一個(gè)局部變量只是一種簡(jiǎn)化語(yǔ)法,它要求編譯器根據(jù)一個(gè)表達(dá)式推斷具體的數(shù)據(jù)類(lèi)型
2.var只能用于聲明方法內(nèi)部的局部變量,而dynamic可用于局部變量,字段,參數(shù)
3.表達(dá)式不能轉(zhuǎn)型為var,但能轉(zhuǎn)型為dynamic
4.必須顯式初始化用var聲明的變量,但無(wú)需初始化用dynamic聲明的變量
例:static void Main(string[] args)
{
//var 在編譯階段已經(jīng)確定類(lèi)型
var number = 3;
//dynamic在編譯期間不進(jìn)行任何的類(lèi)型檢查,而是將類(lèi)型檢查放到了運(yùn)行期
dynamic dyn = 3;
dyn = "hello world";
//runtime eror
//字符串沒(méi)有 "fn不存在的方法" 的方法,但在語(yǔ)法檢查時(shí)通過(guò),不會(huì)提示語(yǔ)法錯(cuò)誤
var s = dyn.fn不存在的方法();
Console.ReadKey();
}
var實(shí)際上是編譯期拋給我們的“語(yǔ)法糖”,一旦被編譯,編譯期會(huì)自動(dòng)匹配var 變量的實(shí)際類(lèi)型,并用實(shí)際類(lèi)型來(lái)替換該變量的申明,這看上去就好像我們?cè)诰幋a的時(shí)候是用實(shí)際類(lèi)型進(jìn)行申明的。而dynamic被編譯后,實(shí)際是一個(gè) object類(lèi)型,只不過(guò)編譯器會(huì)對(duì)dynamic類(lèi)型進(jìn)行特殊處理,讓它在編譯期間不進(jìn)行任何的類(lèi)型檢查,而是將類(lèi)型檢查放到了運(yùn)行期。
3.C#中int和System.Int32理解總結(jié)
int是System.Int32的別名,但是存在爭(zhēng)議
4.什么是委托?
委托是尋址方法的.NET版本,使用委托可以將方法作為參數(shù)進(jìn)行傳遞。委托是一種特殊類(lèi)型的對(duì)象,其特殊之處在于委托中包含的只是一個(gè)或多個(gè)方法的地址,而不是數(shù)據(jù)。
委托雖然看起來(lái)像是一種類(lèi)型,但其實(shí)定義一個(gè)委托,是定義了一個(gè)新的類(lèi)。
下面這行代碼,定義了一個(gè)委托,使用ILDasm.exe查看其生成的IL代碼如圖所示:
//定義委托,它定義了可以代表的方法的類(lèi)型,但其本身卻是一個(gè)類(lèi)publicdelegateintmethodDelegate(stringstr);
由圖中紅色框線中可以看出,.NET將委托定義為一個(gè)密封類(lèi),派生自基類(lèi)System.MulticastDelegate,并繼承了基類(lèi)的三個(gè)方法。
2.委托與函數(shù)指針的區(qū)別?
1、安全性:C/C++的函數(shù)指針只是提取了函數(shù)的地址,并作為一個(gè)參數(shù)傳遞它,沒(méi)有類(lèi)型安全性,可以把任何函數(shù)傳遞給需要函數(shù)指針的地方;而.NET中的委托是類(lèi)型安全的。
2、與實(shí)例的關(guān)聯(lián)性:在面向?qū)ο缶幊讨?,幾乎沒(méi)有方法是孤立存在的,而是在調(diào)用方法前通常需要與類(lèi)實(shí)例相關(guān)聯(lián)。委托可以獲取到類(lèi)實(shí)例中的信息,從而實(shí)現(xiàn)與實(shí)例的關(guān)聯(lián)。
3、本質(zhì)上函數(shù)指針是一個(gè)指針變量,分配在棧中;委托類(lèi)型聲明的是一個(gè)類(lèi),實(shí)例化為一個(gè)對(duì)象,分配在堆中。
4、委托可以指向不同類(lèi)中具有相同類(lèi)型返回參數(shù)和簽名的函數(shù),函數(shù)指針則不可以。
5.** C#中的委托是什么?事件是不是一種委托?**
答:委托本質(zhì)上是一種“方法接口”,它相當(dāng)于C/C++中的函數(shù)指針,當(dāng)然它比函數(shù)指針安全,在C#中通常用于事件處理。
事件不是委托,不過(guò)由于事件的性質(zhì)決定了處理它的程序邏輯能訪問(wèn)的參數(shù),因此,在C#中處理事件的邏輯都包裝為委托。