警惕值型別的陷阱

2021-09-08 06:59:45 字數 1006 閱讀 2957

**1:

struct 

mystruct

}class

program

}

輸出結果:

而如果去掉委託,直接setvalue,結果當然就是1了。為什麼加了乙個委託結果就完全不同了呢?

我們知道,委託內部有乙個object型別的_target欄位,用來指明委託所呼叫的方法所在的例項型別。在這個例子中,_target就是ms。而ms是值型別的,因此這裡會存在乙個裝箱操作。委託所呼叫的是裝箱之後的引用型別的setvalue方法,這只會影響裝箱之後的引用型別,並不會影響裝箱之前的值型別。因此ms.value仍然為0。

il如下:

.method private hidebysig static void  main() cil managed

// end of method program::main

**2:

struct 

mystruct

}class

program

}

輸出結果:

為什麼兩次都是1呢?是第一次increment起作用了,而第二次沒有起作用,還是兩次都起作用了但是沒有對ms.value進行修改呢?我們還是請出il來說話:

.method private hidebysig static void  main() cil managed

// end of method program::main

可見,編譯器建立了乙個型別為為mystruct臨時變數,在每次呼叫ms.increment之前,都會載入這個臨時變數。這樣每次執行方法所使用的ms都是該臨時變數,increment方法所做的value值的修改,並不能反映到該臨時變數上去,因為這個臨時變數是不變的(唯讀)。

由以上兩個例子可以看出,值型別經常產生我們意想不到的結果,因此在自定義值型別時,一定要設計為不可變的(immutable)。否則後果自負……

警惕!電腦銷售人員的陷阱

說起這件事,我覺得自己很丟臉,不懂得如何保護自己的合法權益也太過輕易相信銷售人員的花言巧語,但為了眾多的電腦需求者購買電腦時,不再上當受騙,我寧願把我這段痛苦的經歷分享給廣大消費者。願大家吸取經驗並引以為戒。對於電腦品牌配置這方面我基本上是一點不了解,所以 2010年11 月11n82j 配置很高,...

警惕 特徵工程 中的陷阱

特徵工程 feature engineering 是機器學習中的重要環節。在傳統的專案中,百分之七十以上的時間都花在了預處理資料上 data preprocessing 其中特徵工程消耗了很多時間。一般來說,特徵工程涵蓋的內容非常廣泛,包括從缺失值補全 特徵選擇 維度壓縮,到對輸入資料的範圍進行變換...

警惕 信用卡分期陷阱

今天接到某行的信用卡服務中心 介紹分期服務,雖然沒想過要分期,因為平時經常用該行的信用卡,就聽了一會,巧的是正好坐在電腦前,還開著ie。介紹說,如果有1000元分10期的話,每期的手續費是7元,如果不分期的話,乙個月的利息是15元。乍一聽,好像挺划算的,但是。分期的手續費是固定的!而你要是自己還的話...