常量和方法

2022-02-15 04:03:02 字數 2183 閱讀 2787

常量

c#中的「常量」有兩種,一種是const修飾,一種是readonly修飾,至於他們之間的區別也很簡單,const是在編譯的時候確定的,即,將const變數的值直接編譯放入il**中,直接定址,沒有另外建立記憶體來儲存const變數。readonly是指該變數不能被修改,唯讀變數,只能在建構函式時對其進行賦值(當然可以使用內聯初始化),由於這個會另外分配記憶體儲存readonly的值,所以執行時可以通過反射來修改。

const預設是static型別,屬於型別級別。當應用程式a呼叫dll b的時候,b中有const變數,如果修改const變數(程式)之後僅僅編譯b的dll,那麼應用程式a的結果是不會變的,因為b中const值已經編譯成il的部分了,因此要適應這樣的改變同時需要編譯應用程式a。

readonly修飾符修飾引用型別時,表示引用是immutable,而並不代表所指向的物件是immutable。

靜態建構函式

靜態建構函式,一般不會預設生成,需要顯式的實現,而且一定是無引數的,而且不能新增訪問限制符,因為預設的是private,至於靜態函式什麼時候執行,分兩種情況,一種是precise,另一種是before-field-init。顧名思義,precise就是當第一次建立型別例項或者訪問成員的時候,先呼叫靜態函式,而且是每次建立例項的時候都檢測是否呼叫了靜態函式;before-field-init是指在訪問這些靜態成員或者呼叫建構函式之前的某乙個時刻,具體時間不定。

有兩種情況,那麼clr是如何決策使用哪一種呢。

當使用內聯的方式初始化靜態變數的時候(是不是也預設靜態建構函式呢,是的,初始化值的時候才會有靜態建構函式,否則建立物件的時候會將變數賦值為0/null),使用的是before-field-init方式,而顯示實現靜態建構函式的時候是用precise方式。

建立物件的4步驟:

1. 分配記憶體,成員字段(包括基類一直到system.object) + 型別物件指標 + 同步塊索引

2. 初始化型別物件指標和同步塊索引

3. 初始化所有欄位為0/null。

4. 呼叫建構函式。

值型別不允許內聯形式的非靜態變數初始化,但是允許內聯形式的靜態變數初始化。

例項建構函式

引用型別的例項建構函式:

有預設的無引數建構函式,允許預設的內聯初始化形式。每當呼叫乙個建構函式構造例項的時候都會將變數初始化定義放入建構函式之前。(clr via c# p207)。而且靜態類預設情況下是沒有預設例項建構函式的,abstract的預設建構函式是protected的。而且有的時候建立乙個物件不一定都得呼叫建構函式的,比如memberwiseclone函式,通過拷貝的形式構造(類似於c++的拷貝建構函式,而c#中的建構函式為c++的普通建構函式)。

值型別的例項建構函式:

運算子過載和型別轉換操作符過載

clr不清楚運算子和型別轉換操作符,都是編譯器決定,編譯之後將他們生成對應的方法,比如+號經過c#編譯之後的方法為op_addition函式,然後元資料維護+和op_addition的對應關係,因此如果使用者自定義乙個函式op_addition不會和+號衝突。

型別轉換操作符分為隱式和顯示2種,一般隱式的都是在不丟失精度和數量級的情況下。而顯式則可能丟失,因此可能會丟擲異常overflowexception等。

過載運算子都是public static的情況,一般至少要有乙個是封閉型別(即在sample類中過載顯式轉換運算子,那麼至少要有乙個引數是sample)。

擴充套件方法

要定義乙個擴充套件方法,首先要在乙個public static類中,擴充套件方法也必須是static,而且至少要有乙個引數,第乙個引數必須要用this 來修飾,比如為stringbuilder擴充套件乙個方法,你可以定義為public static void indexof(this stringbuilder sb, char value); 那麼可以直接通過sb.indexof('c')來訪問了,這樣做的好處有:

1. 這樣我們無需明確標出哪個靜態類中呼叫方法,編譯器會自己尋找匹配的擴充套件方法,當然如果引入靜態類的命名空間可以提高效能,使編譯器更快的找出。

2. 鏈式表達,可以實現sb.replace('c', 'b').indexof('c')。

當然擴充套件方法也存在乙個問題,就是版本問題,如果.net 某某版本支援stringbuilder的indexof方法,那麼他會先尋找官方庫定義的那個。

常量指標和指標常量巧妙記憶方法

1.常量指標通常有兩種表示方法 method 1 const double ptr method 2 double const ptr 2.指標常量通常表示為 double const ptr 很多人經常遇見上述三種表示方法處於懵的狀態,現提供記憶方法如下。首先,不管三七二十一先把double pt...

CLR via C 常量,欄位和方法

常量 具有以下特性 1.c 允許定義基元型別常量,也允許定義非基元型別常量 值必須為null 2.常量被視為靜態成員 不能用static修飾 而不是例項成員。3.常量的指向和值都不允許被修改。字段 具有以下特性 1.c 允許定義任何資料型別的字段。常用的字段修飾符如下表所示 clr術語 c 術語 說...

PHP魔術方法和魔術常量

具體的解釋如下 1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 c...