1.為什么訪問椇途矗空間比堆快盾饮?
棧直接從地址讀取數(shù)據(jù)到寄存器采桃,放到目標(biāo)地址
對將分配的地址放到寄存器,取出這個(gè)地址的值丐谋,再放到目的地址
2.值類型與引用類型區(qū)別
值類型是像int芍碧、float等基本數(shù)據(jù)類型,
引用類型是像class号俐、string自定義的數(shù)據(jù)類型
如果通過參數(shù)傳遞泌豆,值類型傳遞的是一個(gè)拷貝,引用類型傳遞的是地址
修改參數(shù)值吏饿,原有值類型不受影響踪危,引用類型會(huì)受影響
值類型是在棧內(nèi)蔬浙,棧的內(nèi)存是自動(dòng)釋放的
引用類型是在堆內(nèi),堆的內(nèi)存是.NET中由GC管理的
值類型存取快贞远,引用類型存取慢
3.值類型和引用類型的基類
值類型繼承與System.ValueType畴博,引用類型繼承于System.Object
4.new一個(gè)對象經(jīng)歷什么
聲明一個(gè)引用
使用new關(guān)鍵字創(chuàng)建對象,并調(diào)用構(gòu)造函數(shù)對其初始化
將引用指向類的對象
5.數(shù)據(jù)長度
引用類型的字段蓝仲,占一個(gè)指針的長度
(32位系統(tǒng)的4個(gè)俱病,64位是8個(gè),)
int16 32 64袱结,分別占:16 32 64位
8位=1字節(jié)亮隙,也就是2字節(jié) 4字節(jié)8字節(jié)
bool和byte和char是1,short是2垢夹,int和float是4溢吻,long是8
6.GC
垃圾回收機(jī)制,對堆內(nèi)內(nèi)存進(jìn)行管理
C#代碼所占用的內(nèi)存又稱mono內(nèi)存
unity通過mono來實(shí)現(xiàn)跨平臺(tái)并解析運(yùn)行C#代碼
mono內(nèi)存分為兩部分果元,一部分是已用內(nèi)存一部分是堆內(nèi)存促王,兩者的差就是空閑內(nèi)存
當(dāng)mono需要分配內(nèi)存的時(shí)候,會(huì)先看空閑內(nèi)存是否足夠
如果夠直接在空閑內(nèi)存中分配
如果不夠就會(huì)進(jìn)行一次GC來釋放更多的空間內(nèi)存
如果GC后仍不夠而晒,就會(huì)向操作系統(tǒng)申請內(nèi)存蝇狼,擴(kuò)充堆的內(nèi)存
或者直接調(diào)用GC.Collect()
7.如何減少GC
減少new對象的次數(shù)
String換成StringBuilder
8.接口和抽象類的區(qū)別
抽象類是abstract,接口是interface
抽象類中可能有方法的具體定義
接口只能定義各個(gè)方法的簽名倡怎,不能實(shí)現(xiàn)具體的代碼
抽象類是抽象于某個(gè)對象的题翰,比如抽象人,抽象鳥
接口是抽象于某個(gè)能力的诈胜,比如能吃飯,能飛翔
抽象類只能單繼承冯事,接口可以多繼承
實(shí)現(xiàn)抽象類可以實(shí)現(xiàn)或者不實(shí)現(xiàn)某個(gè)方法
實(shí)現(xiàn)接口必須實(shí)現(xiàn)中的所有方法
9.權(quán)限關(guān)鍵字
private:只有本類訪問
public:所有類都可訪問
protected:本類或者子類訪問
internal:本項(xiàng)目內(nèi)訪問
10.Mono和.NET的關(guān)系
.Net只能在windows下運(yùn)行
mono可以實(shí)現(xiàn)跨平臺(tái)的.Net
11.反射
得到程序集中的屬性或者方法
Assembly.Load
assembly.GetTypes()
Activator.CreateInstance(type)
type.GetMethod()
12.struct和class區(qū)別
使用上沒區(qū)別焦匈,都可以定義字段屬性方法構(gòu)造函數(shù),可以new
struct不支持繼承
struct是值類型
13.String
是一個(gè)特殊的對象昵仅,一旦賦值就不可改變
使用=或者+都會(huì)創(chuàng)建一個(gè)新的字符串對象缓熟,也就是分配新的內(nèi)存空間(但是系統(tǒng)內(nèi)部會(huì)優(yōu)化,享元模式)
"str"+9會(huì)發(fā)生裝箱操作
"str"+9.ToString()通過非托管方法摔笤,直接操作內(nèi)存完成int到string的轉(zhuǎn)換
14.裝箱與拆箱
把值類型轉(zhuǎn)換為object引用類型會(huì)發(fā)生裝箱够滑,反之則為拆箱
15.裝箱會(huì)帶來性能消耗,經(jīng)歷了什么吕世?
為值類型在托管堆中分配內(nèi)存彰触,
將值類型的值復(fù)制到新分配的堆內(nèi)存中
返回已經(jīng)成為引用類型的對象的地址
16.StringBuilder
預(yù)先以非托管的方式分配內(nèi)存
大量拼接字符串,可以優(yōu)化性能
17.c#編譯過程
c#代碼命辖,經(jīng)過C#編譯器况毅,變成程序集dll
程序集包括數(shù)據(jù)源和IL代碼分蓖,再經(jīng)過JIT編譯器,變成CPU指令
18.==和Equals
CLR將相等分為兩種:
值相等:比較兩個(gè)變量所包含的數(shù)值是否相等
引用相等:比較兩個(gè)變量引用是否是內(nèi)存中的同一個(gè)對象
在C#中尔许,操作符==和方法Equals都是
如果是值類型就比較值么鹤,如果是引用類型就比較地址
Object.ReferenceEquals,是專門比較引用的
19.委托和事件的區(qū)別
委托是一個(gè)類味廊,維護(hù)者一個(gè)字段蒸甜,指向一個(gè)方法,可以實(shí)例化
編譯成IL代碼后余佛,可以看到是一個(gè)類柠新,里面還有Invoke方法
事件是一個(gè)委托類型的變量
20.委托的閉包
List<Action> lists = new List<Action>();
for (int i = 0; i < 5; i++)
{
Action t = () =>
{
Console.WriteLine(i.ToString());
};
lists.Add(t);
}
foreach (var item in lists)
{
item.Invoke();
}
21.Dictionary內(nèi)部實(shí)現(xiàn)
是一個(gè)key-value鍵值對的形式存儲(chǔ)數(shù)據(jù),查找的復(fù)雜度在O(1)
內(nèi)部原理:
Hash算法
沖突解決方法衙熔,采用next
22.Dictionary和Hashtable區(qū)別
Dictionary支持泛型登颓,hashtable不支持泛型,會(huì)進(jìn)行裝箱拆箱操作