[C#] 淺談對象析構器的調用時機與作用域的問題
在CLR討論GC的章節中,我們知道對象被回收前會調用其Finalize方法。而我們也可以使用析構函式來達到重寫Finalize方法的效果。
但事實是否真的這麼理想呢?Finalize方法是否也能順利被調用呢?似乎不然。
在CLR討論GC的章節中,我們知道對象被回收前會調用其Finalize方法。而我們也可以使用析構函式來達到重寫Finalize方法的效果。
但事實是否真的這麼理想呢?Finalize方法是否也能順利被調用呢?似乎不然。
Json在Unity中的應用主要有兩種方式:一是使用Unity內置的JsonUtility;二是引入其他團隊/個人製作的dll/代碼,比如LitJson/MiniJSON等等,網絡上有很多不同的Json轉譯工具。不過於我而言,我一般都是直接使用Unity內置的JsonUtility來完成,這裡我就總結一下我是怎麼在《Endless End》中使用JsonUtility來完成存檔讀檔系統的。
在《Endless End》裡,角色通過把箱子推到某些特定的地方來觸發機關的啟動是其中一個重要的解謎元素。因此,我們就要做一些能被玩家檢測到,並在接觸後與玩家向同一方向移動的「箱子」。
由於《Endless End》需要玩家「一層一層往上走」,因此,一些允許玩家垂直移動的道具就成為了必要場景物品。對於這一點,我做了兩個東西讓玩家「垂直移動」,其中一個就是可以讓玩家乘上後,自動升降的升降機。這篇文章是我對升降機功能實現過程的總結。
由於《Endless End》需要玩家「一層一層往上走」,因此,一些允許玩家垂直移動的道具就成為了必要場景物品。對於這一點,我做了兩個東西讓玩家「垂直移動」,其中一個就是玩家可以上下攀爬的梯子。這篇文章是我對梯子功能實現過程的總結。
在我們遊戲開發的過程中,其實有很多的變量/字段都可能是需要頻繁使用,但是這些變量/字段的值又是在那個物體/類在實例化的時候、甚至是遊戲一開始時就已經決定好而且之後都不會再進行改變的,那麼我們在這些字段之前加上readonly或const的話,在使用的時候不但會更方便,也會更加安全。說的更準確一點的話,readonly會讓字段使用更安全,const會讓字段使用更方便。
我們常用的int在整型值類型中所佔用的空間是非常龐大的。其實很多時候我們都用不完這麼多的數值空間,我們可能只是聲明一個int speed的變量,它的值最大也不會超過1000,但是只要我們聲明了,對應的空間就會被佔用,也就是說,可以用16-bit解決的問題,我們足足多用了一倍的內存去解決。因此,根據變量的可能取值區間去判斷要用哪種值類型數據,可以有效減少記憶體的消耗。
擴展方法(Extension Methods)是對現有的數據類型實現一些自定義的操作的方法。善用擴展方法能有效地提高開發效率,減少很多冗餘的代碼。
Lambda表達式雖然可以被主動轉換成一個委托類型,但它實際上更多的是一種「使用方式」。所以,Lambda表達式本身其實並不歸屬於任何類型,因此也無法傳入一個接受泛型參數的函數之中。
lambda表達式與一般函數的不同之處,前者更多像是一個臨時的函數,它們基本是不會被重新被調用到的或者找到它們的位置的;而後者更多像是注冊了一個地址一樣,我們可以隨時根據名字找到這個函數的位置。