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,今天分享就到這里,有問題的或者有建議的歡迎留言提出!!!