谈谈 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,今天分享就到这里,有问题的或者有建议的欢迎留言提出!!!
谈谈 c# 对象初始化问题的更多相关文章
- EC笔记,第一部分:4.确定对象初始化
04.确定对象初始化 将对象初始化,C++反复无常,所以在使用前应该手动初始化 1.分清赋值与初始化 以下例子: class test{ public: int a; test(){ a=0;//赋值 ...
- Linq专题之对象初始化器
在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...
- C++中对象初始化
在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...
- JAVA 对象初始化的过程
对象初始化的过程例:Student S = new Student();1.因为new Student()用到了Student类,所以会把它从硬盘上加载进入内存2.如果有static静态代 ...
- Java对象初始化详解
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...
- Java对象初始化详解(转)
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...
- c#对象初始化
class test:IEquatable<test> { public int aa { get; set; } public string bb { get; set; } publi ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- Java父类子类的对象初始化过程
摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...
随机推荐
- Lexer的设计--上(3)
lexer的构造函数 有了上一节Token做铺垫, 可以开始设计lexer, 首先应该想到的是, 源代码是以文件流的格式传到编译器中的, 所以作为编译器的前段的第一个阶段, lexer必须负责处理输入 ...
- Windows系统CPU内存网络性能统计第一篇 内存
最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...
- Python在windows下的服务程序
Python程序作为Windows服务启动,需要安装pywin32包.下载路径: 我是下载路径 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- 零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I
原文:零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I 本章将教大家如何更改Button的预设Template,以及如何在Button内设置 ...
- Android零基础入门第84节:引入Fragment原来是这么回事
随着大众生活水平的提高,再加上移动互联网的迅速发展,几乎每个人都至少拥有一台搭载Android系统的移动设备.Android设备的多样性给我们带来了很大的便捷,各Android设备拥有不同分辨率和不同 ...
- Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法
最近在Delphi开发中用到了无边框窗体显示时,无法在任务栏使用右键弹出菜单的情况,经过整理,通过以下方法可以使右键菜单出现: procedure Tfrm_Base.InitSysMenu;var ...
- file.delete()与file.deleteOnExit(); 的区别
file.delete() //删除文件,删除的是创建File对象时指定与之关联创建的那个文件.这是一个立刻执行的操作 file.deleteOnExit(); //在JVM进程退出的时候删除 ...
- Qt之Model-View架构(雨田哥的博客)
Qt之Model-View架构 Qt之Model-View架构 简述 效果图 代码 结尾 简述 为什么会用这个模式,这里我就不解释了,可以看下 豆子哥的见解 .这里我只是如何去使用的.供大家共同探讨学 ...
- MFC中的模态对话框与非模态对话框,模态对话框测试
http://blog.csdn.net/u010839382/article/details/52972427 http://blog.csdn.net/u010839382/article/det ...
- uc手机浏览器使用animation的一个坑
最近做一个项目,应用在移动端,其中涉及一个评论组件.按照现有的趋势,是有评论的地方必有点赞.当然我们的组件也未免于难.大概操作部分设计如下 如此简low的设计,点个赞加个一这效果实在是简直是捞比啊!! ...