以前在学习过程当中只是知道该如何初始化对象,可是却不明白为什么要这么作,不这么作有什么问题。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,今天分享就到这里,有问题的或者有建议的欢迎留言提出!!!