谈谈 c# 对象初始化问题

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,今天分享就到这里,有问题的或者有建议的欢迎留言提出!!!

 

转载于:https://www.cnblogs.com/guhuazhen/p/11155362.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值