Chapter4 型別基礎

2022-02-05 03:09:10 字數 2629 閱讀 7192

clr要求所有物件都用new操作符來建立

employee e=new employee("constructorparam1");

new操作符所做的事情:

1.計算型別以及所有基類中定義的例項欄位所需要的位元組數

2.在託管堆中分配指定型別要求的位元組數,分配物件的記憶體

3.它初始化物件的「型別物件指標」和「同步塊索引」成員

4.呼叫型別的例項構造器,編譯器會在構造器中自動生成**來呼叫乙個基類構造器,每個型別的構造器負責初始化有這個型別定義的例項字段,最終呼叫system.object的構造器

new 執行了所有這些操作之後,會返回指向新建物件的乙個引用,這個引用儲存在變數e中

clr允許乙個物件轉換為它的實際型別或者它的基型別。

型別安全性測驗:

internal class b{} //基類

internal class d:b{} //派生類

**:語句

編譯成功和執行

編譯時錯誤

執行時錯誤

object o1=new object();

√object o2=new b();

√object o3=new d();

√object o4=o3;

√b b1=new b();

√b b2=new d();

√d d1=new d();

√b b3=new object();

√d d2=new object();

√b b4=d1;

√d d3=b2;

√d d4=(d)d1;

√d d5=(d)b2;

√d d6=(d)b1;

√b b5=(b)o1;

√b b6=(d)b2;

√使用c#is和as操作符來轉型

is:檢查乙個物件是否相容於指定的型別,並返回乙個boolean值,is永遠不會丟擲異常

if(o is employee)

as:如果相容指定型別就返回乙個指定型別非null的引用,不相容,返回null

employee e=o as employee;

if(e!=null)

一般情況as用的比較多,因為使用is會檢查兩次物件的型別,首先核實o是否相容employee,如果是執行if內語句在核實o是否引用乙個employee。效能沒有as高。

c# using 指令

潛在問題:可能有兩個或多個型別在不同的命名空間中具有相同的名稱

例如:microsoft下有個widget的型別,wintellect下也有個widget的型別

using microsoft;

using wintellect;

widget w=new widget(); //乙個不明確的引用

解決方案:

//將wintellectwidget定義成wintellect.widget的別名

using wintellectwidget=wintellect.widget;

注意:命名空間和程式集(實現了乙個型別的檔案)不一定是相關的。特別是,同乙個命名空間中的各個型別可能是在不同的程式集中實現的。

例如system.io.filestream型別是在mscorlib.dll程式集中實現的,而system.io.filesystemwatcher是在system.dll中實現的。

1.型別、物件、執行緒棧和託管堆在執行時的相互關係

執行緒棧:1個執行緒建立時,會分配乙個1mb大小的棧,這個棧的空間用於向方法傳遞實參,並用於方法內部定義的區域性變數。

由於執行緒棧是從高位開始分配記憶體,先分配的我就畫在上面了,在呼叫m1()方法時,分配記憶體的順序是:name->s->m2的返回位址->length->tally;

**記憶體的順序當然是反過來的。在乙個方法中,應該包含一些序幕**,進行一些初始化工作,還有一些尾聲**,等方法執行完成之後做一些**工作。

由於方法的返回位址先分配,在方法執行完成的時候回到返回位址,遞迴太深就容易出現棧溢位,因為引數、區域性變數都必須等到方法返回的時候才能**。

2.呼叫靜態方法、例項方法和虛方法的卻別

假設有2個類定義:

internal

class

person

//虛方法

public

virtual

void say(string

word)

//靜態方法

public

static

string

head()

public

static

int age = 10;}

internal

class

student : person

}現在馬上就要呼叫main入口方法:

static

void main(string

args)

1.jit將main的il**轉換成本地cpu指令,然後將內部引用的所有型別的程式集載入,然後建立資料結構來表示型別本身,如圖所示

2.當clr確定方法需要的所有型別物件都以建立,開始允許執行緒執行main的本地**,然後main執行它的**來構造乙個student物件,這造成託管堆中建立了student的乙個例項

略。。。。以後單獨拿出一篇來介紹

Chapter 4 前後查詢

假設,現在有這樣乙個需求,需要從下面這則雜亂無章的文字 比如日誌 中提出所有人的姓名,所有人的姓名以 name 開頭,逗號結尾。name tom,password 123 name kim,password zas345 abc name kate,password pp456 name peter...

chapter4操作列表

1 如何 遍歷 整個列表?假設有乙個列表,需要將其中每個元素列印出來。需要注意是中文輸出會報錯,參考 在geany下輸出中文的方法 解決 刪除中文後就ok了 2 在 for 迴圈後面,沒有縮排 indent 的 都只執行一次,而不會重複執行。3 python 根據縮進來判斷 行與前乙個 行的關係。避...

Chapter 4 持久儲存資料物件

1 使用with open filename.副檔名 r w rb wb as data代替data open data.close 開啟檔案或者是寫檔案時一定要在檔名後加上副檔名,因為open 函式是根據檔名 副檔名搜尋滿足條件的檔案的。2 本章最重要的是了解到pickle 醃製 模組,此模組允許...