以前在學習過程當中只是知道該如何初始化對象,可是卻不明白爲什麼要這麼作,不這麼作有什麼問題。html
如今就針對我最近遇到的問題(定義了全局字節數組沒有初始化,而後在多線程裏頭使用,而後就一直報null的錯誤,一開始也沒有想到是初始化的問題,就一直覺得是通信中斷,數組沒有賦值成功,調了一段時間,檢查了一下代碼,發現字節數組沒有初始化,而後把它初始化以後試了一下還真是),在這裏給你們分享一下。編程
初始化定義:數組
初始化在計算機編程領域中指爲數據對象或變量賦初值的作法,如何初始化則取決於所用的程序語言以及所要初始化的對象的存儲類型等屬性。用於進行初始化的程序結構則稱爲初始化器或初始化列表。初始化和變量聲明是有明顯區別的,並且變量聲明也先於初始化進行,但二者在實踐中仍常被混淆。多線程
1、關於使用new作了哪些事情呢 ?函數
一、 在 棧內存爲引用開闢空間
二、 在 堆內存爲對象開闢空間
三、 對 對象的成員變量進行 默認初始化 //默認初始化爲null
四、 對 對象的成員變量進行 顯示初始化 //賦予初始值
五、 經過 構造方法對 對象的成員 變量賦值
六、 對象初始化完畢,把對象地址賦值給引用變量post
二 、變量聲明後和變量賦值爲null或變量調用了new的區別。性能
主要區分函數中的變量和對象中的字段的區別。學習
一、變量聲明後,沒有進行賦值的含義:url
聲明未賦值,會沒法生成,提示‘使用了未賦值的變量’。spa
經過Reflecter能夠看到,聲明變量未賦值,實際是不存在的,那麼就是說沒有進行分配內存。
二、變量賦值爲null
代表變量具備內存空間,可是內存中什麼也不存在。
三、變量調用new
變量中存在了對象也就是存在了字段,只是字段進行了賦值,賦值爲默認值。
C# 引用類型和值類型
一、引用類型
FCL(Framework)中的大多數類型都是引用類型,引用類型老是在託管堆中分配的,C#的new操做符會返回對象的內存地址,也就是指對象數據的內存地址。在使用引用類型時,存在如下性能問題,這是咱們在開發中必需要注意的:
a、內存必須從託管堆上分配(也就是說每new一個對象,會佔用內存,對象過多就會致使內存佔用)
b、 堆上分配的每一個對象都有一些額外的成員,這些成員必須初始化
c、對象中的其餘字節(爲字段而設),老是設爲0
d、從託管堆中每分配一個對象,可能強制執行一次垃圾回收操做
因此當咱們的應用程序中都是引用類型時,應用程序的性能會顯著降低。
二、值類型
上面介紹了引用類型,知道了當從託管堆中每分配一個對象時,都會形成應用程序性能的降低。設想當使用Int32類型初始化一個數字6或者使用float初始化一個浮點數6.6的時候,都進行一次內存的分配,那麼應用程序的性能會受到嚴重的影響.爲了提供應用程序的性能,CLR提供了名爲"值類型"的輕量級類型.
關於值類型和引用類型相信大家會遇到裝箱拆箱的問題。
我暫時沒時間去寫,這些博客寫的蠻好的,大家能夠參考一下。
http://www.javashuo.com/article/p-bgfcdafq-dq.html
http://www.javashuo.com/article/p-ddicijkh-mb.html
ok,今天分享就到這裏,有問題的或者有建議的歡迎留言提出!!!