C#對象初始化 之前在學習過程中只是知道該如何初始化對象,但是卻不明白為何要這麼做,不這麼做有什麼問題。 現在就針對我最近遇到的問題(定義了全局位元組數組沒有初始化,然後在多線程裡頭使用,然後就一直報null的錯誤,一開始也沒有想到是初始化的問題,就一直以為是通訊中斷,數組沒有賦值成功,調了一段時間, ...
C#對象初始化
之前在學習過程中只是知道該如何初始化對象,但是卻不明白為何要這麼做,不這麼做有什麼問題。
現在就針對我最近遇到的問題(定義了全局位元組數組沒有初始化,然後在多線程裡頭使用,然後就一直報null的錯誤,一開始也沒有想到是初始化的問題,就一直以為是通訊中斷,數組沒有賦值成功,調了一段時間,檢查了一下代碼,發現位元組數組沒有初始化,然後把它初始化之後試了一下還真是),在這裡給大家分享一下。
初始化定義:
初始化在電腦編程領域中指為數據對象或變數賦初值的做法,如何初始化則取決於所用的程式語言以及所要初始化的對象的存儲類型等屬性。用於進行初始化的程式結構則稱為初始化器或初始化列表。初始化和變數聲明是有明顯區別的,而且變數聲明也先於初始化進行,但兩者在實踐中仍常被混淆。
一、關於使用new做了哪些事情呢 ?
1、 在 棧記憶體為引用開闢空間
2、 在 堆記憶體為對象開闢空間
3、 對 對象的成員變數進行 預設初始化 //預設初始化為null
4、 對 對象的成員變數進行 顯示初始化 //賦予初始值
5、 通過 構造方法對 對象的成員 變數賦值
6、 對象初始化完畢,把對象地址賦值給引用變數
二 、變數聲明後和變數賦值為null或變數調用了new的區別。
主要區分函數中的變數和對象中的欄位的區別。
1、變數聲明後,沒有進行賦值的含義:
聲明未賦值,會無法生成,提示‘使用了未賦值的變數’。
通過Reflecter可以看到,聲明變數未賦值,實際是不存在的,那麼就是說沒有進行分配記憶體。
2、變數賦值為null
表明變數具有記憶體空間,但是記憶體中什麼也不存在。
3、變數調用new
變數中存在了對象也就是存在了欄位,只是欄位進行了賦值,賦值為預設值。
C# 引用類型和值類型
1、引用類型
FCL(Framework)中的大多數類型都是引用類型,引用類型總是在托管堆中分配的,C#的new操作符會返回對象的記憶體地址,也就是指對象數據的記憶體地址。在使用引用類型時,存在以下性能問題,這是我們在開發中必須要註意的:
a、記憶體必須從托管堆上分配(也就是說每new一個對象,會占用記憶體,對象過多就會導致記憶體占用)
b、 堆上分配的每個對象都有一些額外的成員,這些成員必須初始化
c、對象中的其他位元組(為欄位而設),總是設為0
d、從托管堆中每分配一個對象,可能強制執行一次垃圾回收操作
所以當我們的應用程式中都是引用類型時,應用程式的性能會顯著下降。
2、值類型
上面介紹了引用類型,知道了當從托管堆中每分配一個對象時,都會造成應用程式性能的下降。設想當使用Int32類型初始化一個數字6或者使用float初始化一個浮點數6.6的時候,都進行一次記憶體的分配,那麼應用程式的性能會受到嚴重的影響.為了提供應用程式的性能,CLR提供了名為"值類型"的輕量級類型.
關於值類型和引用類型相信你們會遇到裝箱拆箱的問題。
我暫時沒時間去寫,這些博客寫的蠻好的,你們可以參考一下。
https://www.cnblogs.com/liqingwen/p/6486332.html
https://www.cnblogs.com/kdp0213/p/8533408.html
ok,今天分享就到這裡,有問題的或者有建議的歡迎留言提出!!!